我正在创建一个简单的用户控件;只是一个ImageButton。
我已经成功将图像绑定到按钮,所以我决定添加一个工具提示。现在我遇到了麻烦。似乎我可以在XAML中为控件硬编码工具提示的文本,但是当它绑定时它返回一个空字符串。
这是我控制的XAML:
<Button x:Class="BCOCB.DACMS.Controls.ImageButton"
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"
d:DesignHeight="300" d:DesignWidth="300"
Name="this"
Style="{StaticResource DisabledButton}">
<Image Source="{Binding ElementName=this, Path=Source}" />
<Button.ToolTip>
<TextBlock Text="{Binding ElementName=this, Path=ToolTipText}" />
</Button.ToolTip>
</Button>
这是工具提示文本的依赖属性信息:
public static readonly DependencyProperty ToolTipTextProperty = DependencyProperty.Register("ToolTipText", typeof(string), typeof(ImageButton));
public string ToolTipText
{
get
{
return this.GetValue(ToolTipTextProperty) as string;
}
set
{
this.SetValue(ToolTipTextProperty, value);
}
}
最后,在我的窗口中声明控件:
<controls:ImageButton x:Name="btnAdd" Source="/DACMS;component/Resources/plus.png" ToolTipText="Add New Item" Click="btnAdd_Click" />
正如我之前提到的,图像绑定得很好,我以完全相同的方式完成了它。
有什么想法吗?
谢谢,
桑尼
DataContext = this
。不过,我想知道如何在XAML中解决这个问题。
答案 0 :(得分:6)
我现在无法测试,但您可以尝试:
<Button.ToolTip
DataContext=”{Binding Path=PlacementTarget.Parent.Parent,
RelativeSource={x:Static RelativeSource.Self}}"
>
<TextBlock Text="{Binding Path=ToolTipText}" />
</Button.ToolTip>
您可能需要在PlacementTarget中使用“Parent”的数量进行一些实验。
希望这有效。我不喜欢给出我没有测试过的答案,但我没有在这台电脑上安装VS. :)
答案 1 :(得分:2)
我遇到了与ContextMenu绑定相同的问题。在我的研究之后,我认为这是因为ToolTip和ContextMenu不存在于您的页面/窗口/控件的可视树中。因此,DataContext不会被继承,并且会使绑定变得麻烦。
这是我发现的Xaml hack对我有用。
答案 2 :(得分:1)
通过xaml将数据上下文设置为“this”的方式如下所示:
<Control DataContext={Binding RelativeSource={RelativeSource Self}}>
另外一点,wpf按钮允许他们的内容几乎是你想要的任何(单个)事物。如果你想要除文本之外的其他东西(即文本和图像),它看起来像这样:
<Button Name="SampleButton" Click="SampleButton_Click">
<Grid Width="70" Height="62">
<Label Content="SampleText"/>
<Image Margin="3,3,3,3" Source="Graphics/sample.ico"/>
</Grid>
</Button>
答案 3 :(得分:0)
由于除了工具提示TextBlock上的Text之外你没有更改任何内容,你可以使用内联声明为你生成TextBlock,并且不需要任何黑客来解决你遇到的名称范围问题否则:
<Button ... ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=ToolTipText}">...
您可以在Image上设置ToolTip并将控件用作DataContext,它可以解决名称范围问题。 DataContext将传递给ToolTip,允许正常绑定:
<Image DataContext="{Binding ElementName=this}" Source="{Binding Source}">
<Image.ToolTip>
<TextBlock FontSize="18" Text="{Binding Path=ToolTipText}" />
</Image.ToolTip>
</Image>
这种方式允许在TextBlock或更复杂的视觉效果上进行其他设置。
答案 4 :(得分:0)
这解决了Tooltip Bindings和Dependencies属性的问题:
<UserControl x:Class="Extended.InputControls.TextBoxUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Extended.InputControls"
x:Name="UserControl"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<TextBox x:Name="textBox">
<TextBox.ToolTip>
<ToolTip Content="{Binding Path=CustomToolTip}" Background="Yellow"/>
</TextBox.ToolTip>
</TextBox>
</UserControl>
而不是这个(不起作用):
<UserControl x:Class="Extended.InputControls.TextBoxUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Extended.InputControls"
x:Name="UserControl">
<TextBox x:Name="textBox">
<TextBox.ToolTip>
<ToolTip Content="{Binding ElementName=UserControl, Path=CustomToolTip}" Background="Yellow"/>
</TextBox.ToolTip>
</TextBox>
</UserControl>