ToolTipservice.ShowOnDisabled不适用于模板样式

时间:2013-12-20 17:40:39

标签: wpf xaml tooltip

我是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

1 个答案:

答案 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。人员班里面没有进一步的名单。

然而它一切正常。

看看图片。

enter image description here

您能为我们提供完整的代码,因此我们也有与您相同的ViewModel。

另外请记住,任何进一步的问题总是给我们完整的代码。

在github.com或其他任何地方上传。