自定义WPF上下文菜单,顶部有文本

时间:2016-01-18 10:48:34

标签: c# wpf xaml

我创建了一个自定义上下文菜单模板,如下所示:

custom context menu

<Style TargetType="{x:Type ContextMenu}">
            <Setter Property="Background" Value="{StaticResource menuBorderBrush}"/>
            <Setter Property="Foreground" Value="{StaticResource menuForegroundBrush}"/>
            <Setter Property="FontSize" Value="13"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ContextMenu}">
                        <Border x:Name="Border" Background="{StaticResource menuBackgroundBrush}" BorderThickness="5" BorderBrush="{StaticResource menuBackgroundBrush}">
                            <StackPanel>
                                <TextBlock TextAlignment="Center" Padding="5,5,5,10">
                                    You are not logged in.
                                </TextBlock>
                                <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle" />
                            </StackPanel>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

现在我希望能够更改&#34;您尚未登录。&#34;文本编程。我尝试从创建一个继承自ContextMenu的自定义控件类开始,并将XAML中的x:Type更改为此类,但是属性(如Background,Foreground,...)是未知的。

如果不从头开始实现新的ContextMenu,我该怎么做呢?

1 个答案:

答案 0 :(得分:0)

您可以使用TextBlock添加Binding TemplatedParent

<TextBlock TextAlignment="Center" Padding="5,5,5,10"
           Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Tag}" />

并将文本添加到ContextMenu Tag属性中。

<Grid.ContextMenu>
    <ContextMenu Tag="Test menuItem text" />
</Grid.ContextMenu>

更新

有一些技巧可以传递许多属性。例如,您可以将ContextMenu绑定到具有许多属性的viewModel。视图模型应具有实现INotifyPropertyChanged行为。所以你可以写这样的东西,但有许多属性。

public class OwnObject : INotifyPropertyChanged
{
    private string _text;

    public string Text
    {
        get { return _text; }
        set { _text = value; NotifyPropertyChanged( "Text" ); }
    }

    #region INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion
    protected void NotifyPropertyChanged( String info )
    {
        if ( PropertyChanged != null )
        {
            PropertyChanged( this, new PropertyChangedEventArgs( info ) );
        }
    }
}

并通过Tag属性传递此viewModel对象。

<Grid.ContextMenu>
    <ContextMenu Tag="{Binding Object}" />
</Grid.ContextMenu>

并在菜单Style中通过Tag.Text

使用它
<TextBlock TextAlignment="Center" Padding="5,5,5,10"
     Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Tag.Text}" />