我是WPF的新手,并努力让工具提示工作在禁用控件上。
我有一个在代码中“幕后”构建的命令列表。这些命令与单选按钮相关联,使用定义样式的资源模板呈现为切换按钮。功能正常,显示效果也很好,只保存一件:
我需要向用户显示,只有当按钮被禁用时,才会显示工具提示。
我似乎无法在禁用的按钮上显示工具提示。我已经尝试将ToolTipService.ShowOnDisabled“true”设置为我能想到的任何地方,并确保IsHitTestVisible为“true”,但似乎没有任何效果。当然,在窗口上使用禁用按钮的简单测试工作正常 - 我假设渲染的复杂性导致我的“禁用显示”不与树的右侧部分相关联。
我已经简化了删除与启用和禁用工具提示相关的触发器的操作,具体取决于按钮的启用状态。在这一点上,我相信如果我能够在禁用按钮上显示工具提示,我将能够实现其余的。但是我确实需要帮助在按钮被禁用时显示工具提示。
这是我的资源XAML的相关部分。
此剪辑定义单选按钮本身及其绑定:
<DataTemplate x:Key="CommandsTemplate" >
<ItemsControl IsTabStop="False" ItemsSource="{Binding}" Margin="0,10,0,0">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Margin="0,2" >
<RadioButton
GroupName="CommandList"
Command="{Binding Path=Command}"
IsChecked="{Binding Path=IsChecked}"
Content="{Binding Path=DisplayName}"
IsEnabled="{Binding Path=Command.CanExecute}"
Style="{StaticResource CommandButtonStyle}"
>
</RadioButton >
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
此剪辑定义命令按钮布局本身。显然,这里的工具提示设置为在启用的按钮上显示以及禁用,但是如果我可以在禁用的按钮上显示它们,我将能够从那里获取它:
<Style x:Key="CommandButtonStyle" TargetType="{x:Type ToggleButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}" >
<Border
x:Name="border"
Padding="0,0,0,0"
CornerRadius="1,1,1,1"
Background="#cfd2d6"
SnapsToDevicePixels="True"
MinWidth="170"
MinHeight="35"
IsHitTestVisible="True"
ToolTipService.ShowOnDisabled="True"
ToolTip="This is a tool tip I want to see."
>
<ContentPresenter x:Name="contentPresenter"
VerticalAlignment="Center"
HorizontalAlignment="Center"
/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="true">
<Setter Property="Background" TargetName="border" Value="#003f73"/>
<Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="#ecf0f3"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我真的很感激帮助 - 我经常使用堆栈溢出并且已经学到了很多东西,但我从来没有完全走到尽头。我不知道还有什么可以尝试的。所以,我想我会问。谢谢 -
编辑:我已将显示问题的代码上传到GitHub。你可以在其中看到Dev Hedgehogs代码的遗骸;我从他的工作示例开始并添加到它,直到问题再次发生。当我添加内部ItemsControl以适应更精细的视图模型时,问题就开始了。代码位于zip文件中 - ToolTipTester.Zip。我希望没关系。 Zip包含完整的项目。
https://github.com/Bearjing/TooltipTestApp/tree/657eb910df6654e61a3228958bc5e854c808e70e
答案 0 :(得分:0)
虽然我不得不改变你的DataTemplate以适应我的ViewModel,但它对我来说都很好。我不知道您的ViewModel看起来如何,所以我需要创建自己的。
这是ViewModel:
class MainWindowViewModel : INotifyPropertyChanged
{
private ObservableCollection<Person> employee;
public MainWindowViewModel()
{
this.Employee = new ObservableCollection<Person>();
this.Employee.Add(new Person { Name = "Test" });
}
public ObservableCollection<Person> Employee
{
get { return this.employee; }
set { this.employee = value; this.OnPropertyChanged("Employee"); }
}
...
这是XAML部分:
<Window.DataContext>
<local:MainWindowViewModel />
</Window.DataContext>
<Window.Resources>
<Style x:Key="CommandButtonStyle" TargetType="{x:Type ToggleButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}" >
<Border
x:Name="border"
Padding="0,0,0,0"
CornerRadius="1,1,1,1"
Background="#cfd2d6"
SnapsToDevicePixels="True"
MinWidth="170"
MinHeight="35"
IsHitTestVisible="True"
ToolTipService.ShowOnDisabled="True"
ToolTip="This is a tool tip I want to see.">
<ContentPresenter x:Name="contentPresenter"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="true">
<Setter Property="Background" TargetName="border" Value="#003f73"/>
<Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="#ecf0f3"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<DataTemplate x:Key="CommandsTemplate">
<RadioButton
GroupName="CommandList"
IsChecked="True"
Content="test"
IsEnabled="false"
Style="{StaticResource CommandButtonStyle}">
</RadioButton>
</DataTemplate>
</Window.Resources>
<Grid>
<ListBox ItemsSource="{Binding Employee}" ItemTemplate="{StaticResource CommandsTemplate}"/>
</Grid>
由于我的ViewModel不支持树类数据结构,因此我不得不抛弃内部ItemsControl。人员班里面没有进一步的名单。
然而它一切正常。
看看图片。
您能为我们提供完整的代码,因此我们也有与您相同的ViewModel。
另外请记住,任何进一步的问题总是给我们完整的代码。
在github.com或其他任何地方上传。