سؤال

وأنا wan't لإخفاء / إظهار menuitems في contextmenu استخدام بعض بربري من وجوه ربط بيانات. ولكن لي menuitems لا يخفون، فإنها تتصرف كما لو ستحدد الرؤية للVisibility.Hidden (لا Visibility.Collapsed كما هو حقا)، ما هو السبب لهذا السلوك؟

وهنا مثال:

وXAML:

<Window x:Class="MenuTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window">
    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="converter"/>
        <DataTemplate x:Key="template">            
            <MenuItem Visibility="{Binding Visible, Converter={StaticResource converter}}" Header="{Binding Title}" />
        </DataTemplate>
        <ContextMenu x:Key="menu" ItemTemplate="{StaticResource template}"/>                    
    </Window.Resources>
    <Grid>
        <Button VerticalAlignment="Center" HorizontalAlignment="Center" Click="OnClick">Button</Button>
    </Grid>
</Window>

والتعليمات البرمجية خلف:

public partial class Window1 : Window
    {
        public ObservableCollection<Item> list = new ObservableCollection<Item>();
        public Window1()
        {
            InitializeComponent();
            list.Add(new Item() { Title = "First", Visible = true }); ;
            list.Add(new Item() { Title = "Second", Visible = false }); ;
            list.Add(new Item() { Title = "Third", Visible = false }); ;
            list.Add(new Item() { Title = "Fourth", Visible = true }); ;
        }

        private void OnClick(object sender, RoutedEventArgs e)
        {
            ContextMenu cm =  FindResource("menu") as ContextMenu;
            cm.PlacementTarget = e.OriginalSource as UIElement;
            cm.Placement = System.Windows.Controls.Primitives.PlacementMode.Left;
            cm.ItemsSource = list;
            cm.IsOpen = true;
        }
    }

    public class Item
    {
        public string Title { get; set; }
        public bool Visible { get; set; }
    }

والقائمة مع أربعة بنود (ولكن اثنين في الوسط دون أي نص واضح في الرأس) والنتيجة هي.

هل كانت مفيدة؟

المحلول

وهذا السلوك لأن ItemTemplate من ContextMenu سيتم تطبيقها على كل من عناصر المربوطة بك <م> في وMENUITEM إنشاؤها لهذا البند. عن طريق وضع MENUITEM إلى DataTemplate الخاص بك، يمكنك إنشاء MENUITEM متداخلة. حتى لو كنت تنهار واحدة الداخلي، منذ واحد الخارجي لا تزال واضحة، لا يزال هناك مساحة لذلك.

ويمكنك إصلاح ذلك عن طريق التخلص من MENUITEM متداخلة في DataTemplate واستبدالها TextBlock، واستخدام أسلوب الذي ينطبق على MENUITEM لضبط الرؤية:

<Window x:Class="MenuTest.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window">
    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="converter"/>
        <DataTemplate x:Key="template">
            <TextBlock Text="{Binding Title}"/>
        </DataTemplate>
        <ContextMenu x:Key="menu" ItemTemplate="{StaticResource template}">
            <ContextMenu.Resources>
                <Style TargetType="{x:Type MenuItem}">
                    <Setter Property="Visibility" Value="{Binding Visible, Converter={StaticResource converter}}"/>
                </Style>
            </ContextMenu.Resources>
        </ContextMenu>
    </Window.Resources>
    <Grid>
        <Button HorizontalAlignment="Center" VerticalAlignment="Center" Click="OnClick">Button</Button>
    </Grid>
</Window>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top