WPF自定义上下文菜单(资源字典)

时间:2015-05-15 11:43:26

标签: c# wpf contextmenu

我为上下文菜单创建了自定义样式。但我必须在每个小部件(文本框)下放置3行代码:

<TextBox.ContextMenu>
    <ContextMenu/>
</TextBox.ContextMenu>

为什么我必须这样做?我的工具提示样式无需任何额外代码即可运行。

我的上下文菜单代码:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Color x:Key="BackgroundColor" A="255" R="19" G="19" B="19"/>

    <BitmapImage x:Key="BiCut" UriSource="Images/cut.tif"/>
    <BitmapImage x:Key="BiCopy" UriSource="Images/copy.tif"/>
    <BitmapImage x:Key="BiPaste" UriSource="Images/paste.tif"/>

    <SolidColorBrush x:Key="BorderBrush" Color="#ECECEC"/>

    <Style TargetType="ContextMenu">
        <Setter Property="Foreground" Value="{StaticResource BorderBrush}"/>
        <Setter Property="SnapsToDevicePixels" Value="True" />
        <Setter Property="OverridesDefaultStyle" Value="True" />
        <Setter Property="Grid.IsSharedSizeScope" Value="true" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ContextMenu">
                    <Border BorderThickness="1" BorderBrush="#2468d9" Padding="2" Background="#131313">
                        <StackPanel Orientation="Horizontal">
                            <StackPanel Orientation="Horizontal" Height="20">
                                <Image Source="{StaticResource BiCut}" Width="20"/>
                                <Button Content="Ausschneiden" Margin="5,0,0,0"/>
                                <TextBlock Text="Strg+X" TextAlignment="Center" VerticalAlignment="Center" Margin="5,0,0,0"/>
                            </StackPanel>
                        </StackPanel>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

2 个答案:

答案 0 :(得分:2)

默认情况下,控件没有ContextMenu(检查属性 - 它是null)。所以你的风格不适用于任何Control。 提示工具提示为null,但如果有必要,则会由TooltipService填充。

没有任何服务可以为您的所有元素填充ContextMenu。使用默认样式(对于Control)。

答案 1 :(得分:1)

您可以为Style创建默认TextBox,并在ContextMenu中添加Style。通过这种方式,您将在应用程序中添加的每个ContextMenu都有TextBox,并且您无需在任何地方添加这三行。

<Style TargetType="{x:Type TextBox}" >
     <Setter Property="ContextMenu">
            <Setter.Value>
                <ContextMenu />
            </Setter.Value>
        </Setter>
</Style>