【问题标题】:WPF ToolBar Item Rendering FailureWPF 工具栏项呈现失败
【发布时间】:2014-09-22 18:57:03
【问题描述】:

我已经根据以下样式实现了一个 ToolBar 和样式。对于我使用 .xaml 资源文件中的矢量图形的图像

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                          xmlns:Caliburn="http://www.caliburnproject.org">
    <Rectangle x:Key="ToolBarButtonIcon" 
                  x:Shared="False" 
                  Visibility="{Binding IconVisibility}"
                  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
                  Width="16" Height="16">
        <Rectangle.Fill>
            <VisualBrush Stretch="Uniform" Visual="{Binding IconSource}"/>
        </Rectangle.Fill>
    </Rectangle>
    <Style x:Key="ToolBarToggleButton" 
             TargetType="{x:Type ToggleButton}" 
            BasedOn="{StaticResource {x:Static ToolBar.ToggleButtonStyleKey}}">
        <Setter Property="Content" Value="{StaticResource ToolBarButtonIcon}"/>
        <Setter Property="ToolTip" Value="{Binding ToolTipText}"/>
        <Setter Property="ToolTipService.IsEnabled" Value="{Binding ToolTipServiceEnabled}"/>
        <Setter Property="IsChecked" Value="{Binding IsChecked}"/>
        <Setter Property="Caliburn:Action.Target" Value="{Binding}"/>
        <Setter Property="Caliburn:Message.Attach" Value="{Binding ActionText}"/>
    </Style>
    <Style x:Key="ToolBarButton" 
             TargetType="{x:Type Button}" 
            BasedOn="{StaticResource {x:Static ToolBar.ButtonStyleKey}}">
        <Setter Property="Content" Value="{StaticResource ToolBarButtonIcon}"/>
        <Setter Property="ToolTip" Value="{Binding ToolTipText}"/>
        <Setter Property="ToolTipService.IsEnabled" Value="{Binding ToolTipServiceEnabled}"/>
        <Setter Property="Caliburn:Action.Target" Value="{Binding}"/>
        <Setter Property="Caliburn:Message.Attach" Value="{Binding ActionText}"/>
    </Style>
</ResourceDictionary>

这使工具栏变得很棒,看起来一切都很好


但如果我将一个工具栏组拖到另一个组上,图像就会消失,我会得到


我知道在图像源上使用了x:Shared="False",但在这种情况下这对我没有帮助。我该怎么做才能强制我的ToolBar 正确呈现?

注意。我还尝试在每个组件上设置所有 Virtualizing 属性,尽管我可能会影响这一点,但这并没有帮助。

感谢您的宝贵时间。


解决方案:

感谢@Mike Strobel,我有一个解决方案。它是改变每个按钮的样式来引用他们自己的Rectangle 图像容器。愚蠢地没有发现这一点,但最终样式变成了

<Style x:Key="ToolBarToggleButton" 
         TargetType="{x:Type ToggleButton}" 
        BasedOn="{StaticResource {x:Static ToolBar.ToggleButtonStyleKey}}">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <Rectangle x:Shared="False" 
                              Visibility="{Binding IconVisibility}"
                              HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
                              Width="16" Height="16">
                    <Rectangle.Fill>
                        <VisualBrush Stretch="Uniform" Visual="{Binding IconSource}"/>
                    </Rectangle.Fill>
                </Rectangle>
            </DataTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="ToolTip" Value="{Binding ToolTipText}"/>
    <Setter Property="ToolTipService.IsEnabled" Value="{Binding ToolTipServiceEnabled}"/>
    <Setter Property="IsChecked" Value="{Binding IsChecked}"/>
    <Setter Property="Caliburn:Action.Target" Value="{Binding}"/>
    <Setter Property="Caliburn: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>
                <Rectangle x:Shared="False" 
                              Visibility="{Binding IconVisibility}"
                              HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
                              Width="16" Height="16">
                    <Rectangle.Fill>
                        <VisualBrush Stretch="Uniform" Visual="{Binding IconSource}"/>
                    </Rectangle.Fill>
                </Rectangle>
            </DataTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="ToolTip" Value="{Binding ToolTipText}"/>
    <Setter Property="ToolTipService.IsEnabled" Value="{Binding ToolTipServiceEnabled}"/>
    <Setter Property="Caliburn:Action.Target" Value="{Binding}"/>
    <Setter Property="Caliburn:Message.Attach" Value="{Binding ActionText}"/>
</Style>

我希望这对其他人有帮助。


工具提示的其他绑定错误

我再次更改了样式以避免工具提示绑定在ToolBarItems 容器被拖动时也会失败。现在的问题是,工具提示仅在将鼠标悬停在包含图像的矩形上而不是在按钮表面上时才会弹出...

<Style x:Key="ToolBarButton" 
             TargetType="{x:Type Button}" 
            BasedOn="{StaticResource {x:Static ToolBar.ButtonStyleKey}}">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Border Background="Transparent"
                              ToolTip="{Binding FullToolTip}"
                              ToolTipService.IsEnabled="{Binding HasToolTip}">
                        <Rectangle x:Shared="False" 
                                  Visibility="{Binding IconVisibility}"
                                  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
                                  Width="16" Height="16">
                            <Rectangle.Fill>
                                <VisualBrush Stretch="Uniform" Visual="{Binding IconSource}"/>
                            </Rectangle.Fill>
                        </Rectangle>
                    </Border>
                </DataTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="Caliburn:Action.Target" Value="{Binding}"/>
        <Setter Property="Caliburn:Message.Attach" Value="{Binding ActionText}"/>
    </Style>

【问题讨论】:

    标签: c# wpf xaml rendering toolbar


    【解决方案1】:

    您的样式将相同的 Rectangle 实例分配给每个按钮的 Content,但 WPF 不允许您在多个视觉树中托管相同的视觉对象。尝试使用 ContentTemplate 来指定按钮的可视化树。

    【讨论】:

    • 感谢您的宝贵时间...我现在就试试这个。
    • 感谢您的上述建议。但我还有另一个问题;虽然上面修复了图像,但ToolTip 绑定也会失败,当ToolBar 被拖动时,与Caliburn 属性的绑定也会失败。我可以通过在矩形上包含工具提示或将矩形包裹在ContentControl 中并将工具提示添加到其中来解决工具提示问题,但这不适用于 Caliburn 属性,也意味着工具提示不显示鼠标悬停在按钮的最边缘。您能否就解决此问题的潜在方法提出建议?
    • 您可以通过使用Background="Transparent" 将Rectangle 包装在Border 中来解决工具提示问题。这确保有一个矩形的可命中测试区域填充内容区域。我不熟悉 Caliburn,因此无法就这些属性提供建议。
    • 感谢您的回复。仅仅在矩形上添加它确实解决了绑定问题,就像它对图像问题所做的那样,它只是不是工具提示的命中测试区域仅在矩形/边框上并且不覆盖整个按钮表面,这是次要的,但很高兴知道如何让它工作......还有其他想法吗?
    • 这很奇怪。当光标位于按钮内容的任何部分上时,ToolTipService 应该遍历树并从样式化的Button 中拾取ToolTip。您不需要在模板中的任何位置显式设置ToolTip。检查并确保您没有直接在按钮上设置本地 ToolTip 值(这将取代样式设置的值)?
    猜你喜欢
    • 2011-01-13
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多