【发布时间】:2014-06-17 18:18:00
【问题描述】:
对不起,如果标题有点误导,我很难给它命名。它也不完全是“中心”。 (更多解释见下文)
你好,我打算做一个项目来写有编号的乐谱。但是我在调平“字体”时发现了一个障碍。 (视觉效果见下图)
- 我需要
1 2 3 3 1 2 3 4 4在一条直线上 - 我使用
WrapPanel作为我的笔记的容器(如屏幕所示)。
主要问题在于音高点,它位于音符上方或下方EITHER。音高绑定到音符,所以我需要在 1 User Control 中处理它。但是,如果是这样,那么我无法将注释“字体”的位置控制在一行中。
下面是我的笔记用户控制代码:
XAML
<UserControl x:Class="RevisiConverter.NumericNoteBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" Width="{Binding ActualWidth, ElementName=txbNote}"
Height="{Binding ActualHeight, ElementName=mainStack}">
<StackPanel Name="mainStack">
<StackPanel Name="topStack">
</StackPanel>
<Canvas Name="canvas" Width="{Binding ActualWidth, ElementName=txbNote}" Height="{Binding ActualHeight, ElementName=txbNote}"
HorizontalAlignment="Center">
<TextBlock Name="txbNote" Text="1" Foreground="Black" FontSize="15"
Margin="0,0,0,-3" FontFamily="Courier" Canvas.Top="0" Canvas.Left="0"/>
</Canvas>
<StackPanel Name="botStack">
</StackPanel>
</StackPanel>
XAML.CS
public partial class NumericNoteBox : UserControl
{
private Note _child;
private Line _sharp;
public Note Child
{
get { return _child; }
set
{
_child = value;
Update();
}
}
public NumericNoteBox()
{
InitializeComponent();
_sharp = null;
}
public void Update()
{
txbNote.Text = _child.MainNote.ToString();
if (_sharp != null)
{
_sharp.Visibility = Visibility.Hidden;
}
topStack.Children.Clear();
botStack.Children.Clear();
if (_child != null)
{
if (_child.Pitch > 0)
{
for (int i = 0; i < _child.Pitch; i++)
{
topStack.Children.Add(new Ellipse());
(topStack.Children[topStack.Children.Count - 1] as Ellipse).Width = 3;
(topStack.Children[topStack.Children.Count - 1] as Ellipse).Height = 3;
(topStack.Children[topStack.Children.Count - 1] as Ellipse).Fill = Brushes.Black;
if (_child.Accidental != Note.Accidentals.Flat)
{
(topStack.Children[topStack.Children.Count - 1] as Ellipse).Margin = new Thickness(0, 1, 0, 0);
}
else
{
(topStack.Children[topStack.Children.Count - 1] as Ellipse).Margin = new Thickness(8, 1, 0, 0);
}
}
}
else if (_child.Pitch < 0)
{
for (int i = 0; i < Math.Abs(_child.Pitch); i++)
{
botStack.Children.Add(new Ellipse());
(botStack.Children[botStack.Children.Count - 1] as Ellipse).Width = 3;
(botStack.Children[botStack.Children.Count - 1] as Ellipse).Height = 3;
(botStack.Children[botStack.Children.Count - 1] as Ellipse).Fill = Brushes.Black;
if (_child.Accidental != Note.Accidentals.Flat)
{
(botStack.Children[botStack.Children.Count - 1] as Ellipse).Margin = new Thickness(0, 1, 0, 0);
}
else
{
(botStack.Children[botStack.Children.Count - 1] as Ellipse).Margin = new Thickness(8, 1, 0, 0);
}
}
}
if (_child.Accidental == Note.Accidentals.Flat)
{
txbNote.Text = "b" + _child.MainNote.ToString();
}
else if (_child.Accidental == Note.Accidentals.Sharp)
{
if (_sharp == null)
{
_sharp = new Line();
_sharp.X1 = 10;
_sharp.Y1 = 2.5;
_sharp.X2 = -2.5;
_sharp.Y2 = 12.5;
_sharp.StrokeThickness = 1;
_sharp.Stroke = Brushes.Black;
canvas.Children.Add(_sharp);
}
_sharp.Visibility = Visibility.Visible;
}
}
}
}
注意:
- 我不受该代码的约束,因此,如果你们中的任何人用完全不同的方法更有效地处理了类似的事情,那么它总是受欢迎的。
- 对于一些语法错误(如果有的话),我们深表歉意,因为英语不是我的第一语言。
- 我觉得我没有真正清楚地解释我的问题,因为我对此也很困惑,所以,请澄清你需要的任何东西。
谢谢
其他细节:
- 点理论上没有一定的限制,但在实践中,它通常最多只有 3 个(顶部 3 个或底部 3 个 - 不能同时使用)
- 在我上面的代码中,note 用户控件分为 3 个网格行,顶部用于堆叠顶部点,中间用于可视化笔记(数字),bot 用于堆叠 bot 点.
- 请澄清任何事情,我会补充更多。
【问题讨论】:
-
数字上方和下方的最大点数是多少,它们必须如何放置?这一切都应该通过 ItemsControl 的正确 ItemTemplate 来完成。
-
@Clemens 感谢您的澄清。我在 OP 的底部做了一些额外的细节,请查看。谢谢。
标签: c# wpf user-controls