繁体   English   中英

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

[英]Implementing an "About" menu item in WPF

获取版本号似乎很简单,例如

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

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

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>

最后一个标题变成“版本”+ ver。

或者进入更复杂的如何动态绑定和静态添加 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”等)

只是为了记录,这里有一个 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" />

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM