Чистое решение Xaml для установки значения свойства при нажатии кнопки? - PullRequest
0 голосов
/ 20 августа 2009

В моем приложении я бы хотел, чтобы контекстное меню кнопки отображалось, когда пользователь нажимает кнопку. Я могу сделать это, создав обработчик события для события нажатия кнопки, а затем установив для свойства контекстного меню IsOpen значение true, но мне интересно, есть ли чисто xaml-решение для того же. Есть идеи?

Спасибо!

Ответы [ 3 ]

1 голос
/ 20 августа 2009

Вы можете создать новый шаблон для кнопки и затем предоставить контекстное меню в визуальном дереве шаблона. Примерно так:

<Style TargetType="{x:Type Button}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type Button}">
        <Border>
          <ContentPresenter HorizontalAlignment="Center"
                            VerticalAlignment="Center"/>
          <Border.ContextMenu>
            <ContextMenu Name="contextMenu">
              <MenuItem Header="Here's a menu."/>
            </ContextMenu>
          </Border.ContextMenu>
        </Border>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

Затем вы можете запустить его, используя свойство кнопки IsPressed, и подключить его, используя установщик с contextMenu в качестве TargetName.

.

Мой реальный вопрос: для чего вы это используете? Открытие контекстного меню при щелчке левой кнопкой мыши по своей сути будет некорректным, поскольку контекстные меню по своей природе закрываются при щелчке по любому другому элементу. Это означает, что этот триггер, даже при правильной настройке, просто сразу откроет и закроет контекстное меню. Мне любопытно, почему вам нужно такое поведение; возможно, есть лучший способ сделать это, чем использовать контекстное меню.

0 голосов
/ 20 августа 2009

Я бы обработал что-то подобное через класс модели представления.

public Visibility ContextMenuVisibility
{
    get { return (this.ShowContextMenu) ? Visibility.Visible : Visibility.Collapsed; }
}

public bool ShowContextMenu { get; set; }

Обработка тех динамических событий, которые находятся на полпути между представлением и моделью, является именно тем, для чего предназначен слой модели представления.

О, и я -1 себя за то, что я не являюсь чистым решением XAML. Просто предлагая другую альтернативу событию onCheckChanged.

0 голосов
/ 20 августа 2009

Вы можете заставить его появиться, используя триггер события, но вам понадобится еще один, чтобы он исчез. Я не могу придумать ни одной комбинации существующих свойств, которая принесла бы вам что-нибудь полезное.

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