【问题标题】:WPF strange context menu behaviourWPF 奇怪的上下文菜单行为
【发布时间】:2014-10-03 08:26:20
【问题描述】:

我使用这段代码动态创建了一个上下文菜单

   protected MenuItem itemAdd, itemDelete, itemSelectBranch, itemDeleteClasp;
    protected MenuItem itemCut, itemCopy, itemPaste, itemAddParent, itemPasteWithChildren;
    protected MenuItem itemAddTask, itemAddExtTask, itemAddMileStone;
 menu = new ContextMenu();
        itemAdd = new MenuItem
                      {
                          HorizontalAlignment = HorizontalAlignment.Left,
                          HorizontalContentAlignment = System.Windows.HorizontalAlignment.Stretch,
                          Header = "Add"
                      };
        itemDelete = new MenuItem
                         {
                             HorizontalAlignment = HorizontalAlignment.Left,
                             HorizontalContentAlignment = System.Windows.HorizontalAlignment.Stretch,
                             Header = "Delete"
                         };
        itemSelectBranch = new MenuItem
        {
            HorizontalAlignment = HorizontalAlignment.Left,
            HorizontalContentAlignment = System.Windows.HorizontalAlignment.Stretch,
                                   Header = "Select"
                               };
        itemAddTask = new MenuItem
        {
            HorizontalAlignment = HorizontalAlignment.Left,
            HorizontalContentAlignment = System.Windows.HorizontalAlignment.Stretch,

                              Header = "Task",

                          };
        itemAddParent = new MenuItem
                            {
                                HorizontalAlignment = HorizontalAlignment.Left,
                                HorizontalContentAlignment = System.Windows.HorizontalAlignment.Stretch,
                                Header = "Parent"
                            };

        itemAddMileStone = new MenuItem
                               {
                                   HorizontalAlignment = HorizontalAlignment.Left,
                                   HorizontalContentAlignment = System.Windows.HorizontalAlignment.Stretch,
                                   Header = "Do sth",

                               };
        itemAddExtTask = new MenuItem
                             {
                                 HorizontalAlignment = HorizontalAlignment.Left,
                                 HorizontalContentAlignment = System.Windows.HorizontalAlignment.Stretch,
                                 Header = "Do sth"
                             };
        itemDelete.HorizontalAlignment = HorizontalAlignment.Left;
        itemDelete.Click += itemDelete_Click;



        itemDeleteClasp = new MenuItem
                              {
                                  HorizontalContentAlignment = System.Windows.HorizontalAlignment.Stretch,
                                  HorizontalAlignment = HorizontalAlignment.Left,
                                  Header = "Do sthm"
                              };
        itemDeleteClasp.Click += itemDeleteClasp_Click;
        itemCopy = new MenuItem {Header = Do sth",HorizontalAlignment = System.Windows.HorizontalAlignment.Left};

        itemCopy.Click += itemCopy_Click;
        itemCut = new MenuItem
                      {
                          HorizontalAlignment = HorizontalAlignment.Left,
                          Header = "Cut"
                      };

        itemPaste = new MenuItem
                        {
                            HorizontalAlignment = HorizontalAlignment.Left,
                            Header = "Paste"
                        };

        itemAddParent = new MenuItem
                            {
                                HorizontalAlignment = HorizontalAlignment.Left,
                                Header = "Do sth"
                            };

        itemPasteWithChildren = new MenuItem
                                    {
                                        HorizontalAlignment = HorizontalAlignment.Left,
                                        Header = "some long text"
                                    };
        itemPasteWithChildren.Click += itemPasteWithChildren_Click;
        itemAddParent.Click += itemAddParent_Click;
        itemPaste.Click += itemPaste_Click;
        itemCut.Click += itemCut_Click;
        itemAddTask.Click += itemAddTask_Click;
        itemAddExtTask.Click += itemAddExtTask_Click;
        itemAddMileStone.Click += itemAddMileStone_Click;
        itemAddParent.Click += itemAddParent_Click;
        itemSelectBranch.Click += itemSelectBranch_Click;
        itemAdd.Items.Add(itemAddTask);
        itemAdd.Items.Add(itemAddExtTask);
        itemAdd.Items.Add(itemAddMileStone);
        itemAdd.Items.Add(itemAddParent);
        menu.Items.Add(itemAdd);
        menu.Items.Add(itemDelete);
        menu.Items.Add(itemDeleteClasp);
        menu.Items.Add(itemSelectBranch);
        menu.Items.Add(itemCopy);
        menu.Items.Add(itemCut);
        menu.Items.Add(itemPaste);

此菜单附加到 textbox.contextmenu 属性。然而菜单看起来很奇怪。菜单项中的每个文本都居中。它看起来很丑,坦率地说,我不知道为什么会这样。有人可以解释一下我如何使它与左对齐吗?

【问题讨论】:

    标签: wpf contextmenu


    【解决方案1】:

    默认情况下,上下文菜单在左侧为图标留出空间。我建议要么使用该空间来放置图标,要么覆盖 ContextMenu 的 ControlTemplate 以获得不同的外观。

    这个例子应该可以帮助你开始使用ControlTemplate

    http://msdn.microsoft.com/en-us/library/ms744758(VS.85).aspx

    如果您已经了解图标空间,并且指的是 MenuItem 标题的默认定位方式,请确保将 Header 文本包装在 StackPanel 中并相应地定位其垂直或水平布局.

    【讨论】:

    • 我已经知道图标空间了。看来我必须将标题文本包装在 StacPanel 中。但是我不知道该怎么做?我应该为每个 Header 创建新的 stacnpanel 吗??
    • 我试图使用 Horizo​​ntalalignment 和 Horizo​​ntalcontentalignemt 属性(并将它们设置为 Left),但它不起作用
    • 你能提供更多代码吗?我无法在我的盒子上重现它,因此您可能需要进行一些小的配置更改。您使用的是哪个版本的 .NET?我在使用 .NET 3.5 时遇到了一些类似的问题,但它更多地与垂直对齐有关——水平对齐默认为左。
    • 我重建了面向 .NET 3.5 和 3.0 的项目,但使用您的代码仍然没有遇到问题(一切都左对齐)。还有其他注意事项吗?您的文本框及其容器是如何定义的?如果可以的话,给我一个完整的例子,我看看能不能复制。
    • 我认为我发现了一个问题。我在我的文本框 中设置了一个样式,如果我用左菜单替换中心就可以了。但是我想在文本框中有居中的文本。
    猜你喜欢
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    相关资源
    最近更新 更多