在WPF中实现“关于”菜单项

时间:2019-05-11 18:58:05

标签: c# wpf menu

获得版本号似乎很简单

string ver Assembly.GetExecutingAssembly().GetName().Version.ToString();

并且也应该在“关于...”菜单项中显示该字符串。但是Google的结果似乎都很复杂,例如

https://stackoverflow.com/questions/2849265/how-to-pass-data-when-using-menuitem-itemcontainerstyle

https://stackoverflow.com/questions/21585828/menuitem-passing-selected-item-to-viewmodel-via-relaycommand-ala-mvvm-light-he

必须有一种简单的方法来执行此操作。类似于

    Window x:Class="WpfApp1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup- 
 compatibility/2006"
            xmlns:local="clr-namespace:WpfApp1"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Menu>
            <MenuItem Header="File">
                <MenuItem Header="Open"/>
                <MenuItem Header="Close"/>
            </MenuItem>
            <MenuItem Header="About">
                <MenuItem Header="Version"/>
            </MenuItem>
            <Grid>
            </Grid>
       </Menu>
    </Window>

最后一个标头变为“版本” +版本。

或者进入更复杂的领域 How do I dynamically bind and statically add MenuItems?

public partial class MainWindow : Window
{
    private ObservableCollection<MyObject> _windows = new ObservableCollection<MyObject>();

    public MainWindow()
    {
        InitializeComponent();
        Windows.Add(new MyObject { Title = "Collection Item 1" });
        Windows.Add(new MyObject { Title = "Collection Item 2" });
    }

    public ObservableCollection<MyObject> Windows
    {
        get { return _windows; }
        set { _windows = value; }
    }
}

public class MyObject
{
    public string Title { get; set; }
}

<Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="233" Width="143" Name="UI">
    <Window.Resources>
        <CollectionViewSource Source="{Binding ElementName=UI, Path=Windows}" x:Key="YourMenuItems"/>
     </Window.Resources>

    <Grid DataContext="{Binding ElementName=UI}">
        <Menu Height="24" VerticalAlignment="Top">
        <MenuItem Header="_View" >
                <MenuItem Header="Windows">
                    <MenuItem.ItemsSource>
                        <CompositeCollection>
                            <CollectionContainer Collection="{Binding Source={StaticResource YourMenuItems}}" />
                            <MenuItem Header="Menu Item 1" />
                            <MenuItem Header="Menu Item 2" />
                            <MenuItem Header="Menu Item 3" />
                        </CompositeCollection>
                    </MenuItem.ItemsSource>
                    <MenuItem.ItemContainerStyle>
                        <Style>
                            <Setter Property="MenuItem.Header" Value="{Binding Title}"/>
                        </Style>
                    </MenuItem.ItemContainerStyle>
                </MenuItem>
            </MenuItem>
        </Menu>
    </Grid>

(不会为我显示“收藏品1”等)

1 个答案:

答案 0 :(得分:0)

仅作记录,这是一个MWE,它执行我想要的非常简单的事情。

using System.Collections.ObjectModel;
using System.Reflection;
using System.Windows;

namespace WpfApp2
{

    public partial class MainWindow : Window
    {
        public ObservableCollection<MyMenuItem> _windows = new ObservableCollection<MyMenuItem>();


        public MainWindow()
        {
            InitializeComponent();

            string ver = Assembly.GetExecutingAssembly().GetName().Version.ToString();
            MyMenuItem versionMenuItem = new MyMenuItem { Title = "Version " + ver };

            Windows.Add(versionMenuItem);
        }


        public ObservableCollection<MyMenuItem> Windows
        {
            get { return _windows; }
            set { _windows = value; }
        }
    }

    public class MyMenuItem
    {
        public string Title { get; set; }
    }
}


<Window x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApp2"
        Title="MainWindow" Height="233" Width="143" Name="UI">
    <Window.Resources>
        <CollectionViewSource Source="{Binding ElementName=UI, Path=Windows, FallbackValue=versionMenuItem, TargetNullValue=0}" x:Key="MyMenuItems" />
    </Window.Resources>

    <Grid DataContext="{Binding ElementName=UI}">
        <Menu Height="24" VerticalAlignment="Top">
            <MenuItem Header="_Version" >
                <MenuItem Header="About">
                    <MenuItem.ItemsSource>
                        <CompositeCollection>
                            <CollectionContainer Collection="{Binding Source={StaticResource MyMenuItems}}" />
                            <MenuItem Header="Licensed To" />
                        </CompositeCollection>
                    </MenuItem.ItemsSource >
                    <MenuItem.ItemContainerStyle>
                        <Style>
                            <Setter Property="MenuItem.Header" Value="{Binding Title}" />
                        </Style>
                    </MenuItem.ItemContainerStyle>
                </MenuItem>
            </MenuItem>
        </Menu>
    </Grid>
</Window>

<Application x:Class="WpfApp2.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp2"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <Style TargetType="MenuItem">
            <Setter Property="HorizontalContentAlignment" Value="Left"/>
            <Setter Property="VerticalContentAlignment" Value="Center"/>
        </Style>
    </Application.Resources>
</Application>

将FallbackValue设置为versionMenuItem可以消除数据问题之一。

<CollectionViewSource Source="{Binding ElementName=UI, Path=Windows, FallbackValue=versionMenuItem, TargetNullValue=0}" x:Key="MyMenuItems" />
相关问题