在基于C#的WPF UserControl中,我有一组Sliders来调整Color元素的红色,绿色和蓝色值;基本上UserControl是一个颜色选择器。我将ToolTipOpening事件处理程序的XAML和C#代码组合在一起,允许我设置表示Color组件属性值的单个整数值。因此,如果我将滑块定位为调整滑块中间颜色的红色数量,则工具提示将显示“红色:125”,因为每个颜色组件属性值的范围可以是0到255.代码片段下面的XAML和C#按预期工作:
XAML:
<UserControl x:Class="CustomColorPicker.ColorPickerUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Name="colorPicker">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50" />
<ColumnDefinition Width="175" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<Label HorizontalAlignment="Right">Red:</Label>
<Slider Grid.Row="0" Grid.Column="1" Name="sliderRed" Minimum="0" Maximum="255"
Margin="{Binding ElementName=colorPicker, Path=Padding}"
Value="{Binding ElementName=colorPicker, Path=Red}"
ToolTipOpening="OnColorSliderToolTipOpening"
ToolTip="Red: 0" />
<Label Grid.Row="1" Grid.Column="0" HorizontalAlignment="Right">Green:</Label>
<Slider Grid.Row="1" Grid.Column="1" Name="sliderGreen" Minimum="0" Maximum="255"
Margin="{Binding ElementName=colorPicker, Path=Padding}"
Value="{Binding ElementName=colorPicker, Path=Green}"
ToolTipOpening="OnColorSliderToolTipOpening" ToolTip="Green: 0" />
<Label Grid.Row="2" Grid.Column="0" HorizontalAlignment="Right">Blue:</Label>
<Slider Grid.Row="2" Grid.Column="1" Name="sliderBlue" Minimum="0" Maximum="255"
Margin="{Binding ElementName=colorPicker, Path=Padding}"
Value="{Binding ElementName=colorPicker, Path=Blue}"
ToolTipOpening="OnColorSliderToolTipOpening" ToolTip="Blue: 0" />
<Rectangle Grid.Column="2" Grid.RowSpan="3"
Margin="{Binding ElementName=colorPicker, Path=Padding}"
Width="85" Stroke="Black" StrokeThickness="1">
<Rectangle.Fill>
<SolidColorBrush Color="{Binding ElementName=colorPicker, Path=Color}" />
</Rectangle.Fill>
</Rectangle>
</Grid>
</UserControl>
C#:
private void OnColorSliderToolTipOpening(object sender, ToolTipEventArgs e)
{
Slider slider = (Slider) sender;
string colorName = "N/A";
int colorValue = 0;
if (slider.Name == "sliderRed")
{
colorName = "Red";
colorValue = (int) Color.R;
}
else if (slider.Name == "sliderGreen")
{
colorName = "Green";
colorValue = (int) Color.G;
}
else if (slider.Name == "sliderBlue")
{
colorName = "Blue";
colorValue = (int) Color.B;
}
string colorTip =
string.Format("{0}: {1}", colorName, colorValue.ToString());
slider.ToolTip = colorTip;
return;
}
有没有办法消除背后的代码,并使用 ToolTip.Content 和 工具提示设置工具提示内容以显示相同的字符串。仅限XAML中的ContentStringFormat 属性,允许在C#后面的代码中消除ToolTipOpening事件处理程序?我使用DataBinding尝试了以下XAML来格式化Slider工具提示的内容字符串:
XAML:
<Slider Grid.Row="2" Grid.Column="1" Name="sliderBlue" Minimum="0" Maximum="255"
Margin="{Binding ElementName=colorPicker, Path=Padding}"
Value="{Binding ElementName=colorPicker, Path=Blue}">
<Slider.ToolTip>
<ToolTip
Content="{Binding ElementName=colorPicker, Path=Blue}"
ContentStringFormat="{}Blue: {0}" />
</Slider.ToolTip>
</Slider>
并且ToolTip Popup显示为空:
答案 0 :(得分:9)
每个ElementName
的绑定就像RelativeSource
与FindAncestor
一样不在范围内,因为ToolTip
是Popup
,它不是VisualTree的一部分(它创造了自己的)。但您可以使用ToolTip.PlacementTarget Property获取Slider
控件并捕获值。
<Slider.ToolTip>
<ToolTip Content="{Binding RelativeSource={RelativeSource Self},
Path=PlacementTarget.Value}"
ContentStringFormat="Blue: {0:0}" />
</Slider.ToolTip>
请注意:0
中的额外ContentStringFormat="Blue: {0:0}"
以对值进行四舍五入。