ContextMenu исчезает сразу после появления - PullRequest
0 голосов
/ 13 июня 2011

У меня есть контекстное меню, но оно исчезает сразу после его появления.

<TextBlock Name="InputtedAddress" Text="{Binding Path=InputtedAddress}"  MouseDown="InputtedAddress_MouseDown"/>
System.Windows.Controls.ContextMenu thisMenu; 
   private void InputtedAddress_MouseDown(object sender, MouseButtonEventArgs e)
        {
            if (e.RightButton == MouseButtonState.Pressed)
            {
                thisMenu = new System.Windows.Controls.ContextMenu();
                MenuItem thisMenuItem = new MenuItem() { Header = "Zoom to Incident" };
                thisMenuItem.Click += new RoutedEventHandler(thisMenuItem_Click);
                thisMenu.Items.Add(thisMenuItem);
                thisMenu.IsOpen = true;
            }
        }

Ответы [ 2 ]

2 голосов
/ 13 июня 2011

Скорее всего, вы не помечаете событие MouseDown для обработки.Установите e.Handled на true, и он больше не будет распространяться, а ваш ContextMenu останется открытым.

Тем не менее, это ужасный способ присвоить ContextMenu во-первых.Почему бы просто не сделать это:

<TextBlock ...>
    <TextBlock.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Zoom to Incident" Click="thisMenuItem_Click"/>
        </ContextMenu>
    </TextBlock.ContextMenu>
</TextBlock>
0 голосов
/ 13 июня 2011

Вы должны назначить свое меню свойству ContextMenu вашего TextBlock, чтобы об открытии и позиционировании позаботились за вас. Вам также не нужно создавать меню в каждом MouseDown; просто создайте его один раз и присвойте его свойству ContextMenu.

В XAML:

<TextBlock 
    Name="InputtedAddress" 
    Text="{Binding Path=InputtedAddress}"  
    >
    <TextBlock.ContextMenu>
        <ContextMenu> 
             <MenuItem
                 Header="Zoom to Incident"
                 Click="ContextMenu_Click"
             />
         </ContextMenu>
    </TextBlock.ContextMenu>
</TextBlock>

Если вы хотите показать его вручную, вам нужно расположить его перед показом, установив свойство PlacementTarget , что-то вроде этого:

private void InputtedAddress_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (e.RightButton == MouseButtonState.Pressed)
    {
        thisMenuPlacementTarget = InputtedAddress;
        thisMenu.IsOpen = true;
    }
}

P.S. «Введено» не слово:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...