ToolBar拖动绑定失败

时间:2014-10-11 13:00:20

标签: c# wpf mvvm binding caliburn.micro

我使用下面显示的代码设置了ToolBar。我遇到了ToolBar样式的三个问题:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:cal="http://www.caliburnproject.org">
    <Style x:Key="ToolBarToggleButton" TargetType="{x:Type ToggleButton}" 
           BasedOn="{StaticResource {x:Static ToolBar.ToggleButtonStyleKey}}">
        <Setter Property="Icon" Value="{Binding Icon}"/>
        <Setter Property="ToolTip" Value="{Binding FullToolTip}" />
        <Setter Property="ToolTipService.IsEnabled" Value="{Binding HasToolTip}" />
        <Setter Property="IsChecked" Value="{Binding IsChecked}" />
        <Setter Property="cal:Action.Target" Value="{Binding}" />
        <Setter Property="cal:Message.Attach" Value="{Binding ActionText}" />
    </Style>
    ...

首先:

工具栏图像当前被用作单个静态实例。即使将x:Shared="False"属性移动到另一个属性ToolBar,也会导致渲染失败。

Failure

解决方案:

在工具提示样式.xaml中,将图像源包含为ContentTemplate

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:cal="http://www.caliburnproject.org">
    <Style x:Key="ToolBarToggleButton" TargetType="{x:Type ToggleButton}" 
           BasedOn="{StaticResource {x:Static ToolBar.ToggleButtonStyleKey}}">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Image x:Shared="false" Source="{Binding Icon}">
                        <Image.Style>
                            <Style TargetType="Image">
                                <Setter Property="Width" Value="16" />
                                <Setter Property="Height" Value="16" />
                                <Setter Property="Stretch" Value="Fill" />
                                <Style.Triggers>
                                    <Trigger Property="IsEnabled" Value="False">
                                        <Setter Property="Opacity" Value="0.5" />
                                    </Trigger>
                                </Style.Triggers>
                            </Style>
                        </Image.Style>
                    </Image>
                </DataTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="ToolTip" Value="{Binding FullToolTip}" />
        <Setter Property="ToolTipService.IsEnabled" Value="{Binding HasToolTip}" />
        <Setter Property="IsChecked" Value="{Binding IsChecked}" />
        <Setter Property="cal:Action.Target" Value="{Binding}" />
        <Setter Property="cal:Message.Attach" Value="{Binding ActionText}" />
    </Style>

    <Style x:Key="ToolBarButton" TargetType="{x:Type Button}" 
           BasedOn="{StaticResource {x:Static ToolBar.ButtonStyleKey}}">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Image x:Shared="false" Source="{Binding Icon}">
                        <Image.Style>
                            <Style TargetType="Image">
                                <Setter Property="Width" Value="16" />
                                <Setter Property="Height" Value="16" />
                                <Setter Property="Stretch" Value="Fill" />
                                <Style.Triggers>
                                    <Trigger Property="IsEnabled" Value="False">
                                        <Setter Property="Opacity" Value="0.5" />
                                    </Trigger>
                                </Style.Triggers>
                            </Style>
                        </Image.Style>
                    </Image>
                </DataTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="ToolTip" Value="{Binding FullToolTip}" />
        <Setter Property="ToolTipService.IsEnabled" Value="{Binding HasToolTip}" />
        <Setter Property="cal:Action.Target" Value="{Binding}" />
        <Setter Property="cal:Message.Attach" Value="{Binding ActionText}" />
    </Style>
</ResourceDictionary>

现在我们有:

Fix

无需其他更改。

第二

同样的拖动过程ToolTipToolTipService绑定也会被破坏 - 在这个阶段我不确定其根本原因。快速解决方案是对上面的图片执行我所做的操作,并将ToolTip添加到Image。但是,这会导致ToolTip仅显示在Image之上,而不是悬停在按钮的最边缘时。

部分解决方案:

ToolTip添加到Image。但是,这并不理想,因为当按钮的最边缘时,工具提示不显示。

第三

当发生上面显示的拖动操作时,这也会破坏Caliburn属性绑定

<Setter Property="cal:Action.Target" Value="{Binding}" />
<Setter Property="cal:Message.Attach" Value="{Binding ActionText}" />

问题:(第二和第三个问题)

  1. 如何解决ToolTip渲染问题?
  2. 如何解决Caliburn属性绑定的问题?
  3. 感谢您的时间。


    解决方案:

    &#34;我终于解决了这个问题。就像我所知,当您在工具栏上启动拖动时,您拖动的工具栏所覆盖的其他工具栏上的任何工具栏项目都会从可视树中的当前位置移除,然后(推测)当他们再次出现时再加上回来。

    当他们从视觉树中删除时(再次,这就是我认为发生的事情),他们也无法访问ToolBarToggleButton和ToolBarButton样式,因为它们是在Styles.xaml资源中定义的在ToolBarsView.xaml中添加的字典。

    但是,如果您在全局范围内定义相同的样式,那么它可以工作 - 即使他们不再是ToolBarsView的子代,他们仍然可以访问全局资源。

    所以...我已经添加了一个新属性IModule.GlobalResourceDictionaries,它允许每个模块声明应该在全局范围添加的任何资源字典。 ToolBars模块使用了这个。&#34;

    https://github.com/tgjones/gemini/issues/67#issuecomment-60040008

1 个答案:

答案 0 :(得分:1)

尝试将工具提示重新指定为鼠标悬停事件的样式触发器,例如:

    <Button.Style>
        <Style TargetType="Button">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                   <Setter Property="ToolTip" Value="{Binding FullToolTip}" />
                   <Setter Property="ToolTipService.IsEnabled" Value="{Binding HasToolTip}" />
                </Trigger>
                <Trigger Property="IsMouseOver" Value="False">
                   <Setter Property="ToolTip" Value="{Binding FullToolTip}" />
                   <Setter Property="ToolTipService.IsEnabled" Value="{Binding HasToolTip}" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Button.Style>