Verhalten des ContextMenü

  • WPF

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von SKeks.

    Verhalten des ContextMenü

    Hallo zusammen,

    mir ist ein komisches Verhalten des Contextmenüs aufgefallen, wenn ich einen Treeview drauf packe. Und zwar möchte ich den Treeview nur zeigen, wenn eine gewisse Bedingung erfüllt ist. Deswegen setze ich die Visibility-Eigenschaft des Treeview zunächst auf "Collapsed" und dann auf Visibility="Visible" wenn Bedingung erfüllt.
    Laut msdn.microsoft.com/en-us/libra…m.windows.visibility.aspx reserviert "Collapsed" keinen Platz im Layout.
    In meinem Fall sollte also das Contextmenu alles außer dem TreeView anzeigen und auch die dazu passende Größe haben. Leider besitzt das ContextMenü an der Stelle des verborgenen TreeViews einen leeren Eintrag an dem Platz reserviert wurde.
    Weiß jemand wie man das lösen kann, so dass mit Visibility="Collapsed" die Größe des Menüs passt?

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:WpfApplication1"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="350" Width="525">
    9. <Grid>
    10. <Button>
    11. <Button.ContextMenu>
    12. <ContextMenu>
    13. <MenuItem Header="Test1"/>
    14. <TreeView Visibility="Collapsed"/>
    15. </ContextMenu>
    16. </Button.ContextMenu>
    17. </Button>
    18. </Grid>
    19. </Window>


    Das Verhalten lässt sich auch mit Buttons und bestimmt noch weiteren UI-Elementen reproduzieren.
    ContextMenu scheint so vorgehen:
    Wenn ein Item bereits ein MenuItem ist, dann wird das direkt angezeigt. Andernfalls wird ein MenuItem erstellt, das Item reingepackt und dann das ganze angezeigt. In diesem Fall wird das Item (also das TreeView) in die Header-Eigenschaft des MenuItems gepackt. Wenn Du dann von dem TreeView die Sichtbarkeit änderst, verschwindet zwar der Header vom MenuItem, das MenuItem selbst ist aber weiterhin sichtbar.
    Verwende folgendes:

    XML-Quellcode

    1. <Button>
    2. <Button.ContextMenu>
    3. <ContextMenu>
    4. <MenuItem Header="Test1"/>
    5. <MenuItem Visibility="Collapsed">
    6. <MenuItem.Header>
    7. <TreeView ItemsSource="{Binding Path=Foo}"/>
    8. </MenuItem.Header>
    9. </MenuItem>
    10. </ContextMenu>
    11. </Button.ContextMenu>
    12. </Button>

    Also mach das ganze MenuItem unsichtbar, dann isses weg.

    Edit:
    Das ist übrigens mit allen ItemsControls so. ListBoxen erstellen ListBoxItems, TreeViews erstellen TreeViewItems, etc.
    Dieses Verhalten kann man irgendwie beeinflussen. Dafür gibts ItemContainerGenerator (msdn.microsoft.com/en-us/libra…rgenerator(v=vs.110).aspx) aber wie der genau funktioniert, weiß ich auch nicht.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils