Я все еще работаю над изменением моего существующего приложения WPF, чтобы быть "совместимым" с подходом MVVM. Я получаю симпатичное проклятое завершение, но не уверен, как решить одно из оставления немногими препятствиями.
У меня есть элемент GUI (в настоящее время кнопка, хотя это могла быть маркировка), где, когда мышь вводит его, это запускает Событие MouseEnter, и это создает всплывающее окно в коде - позади. Всплывающее окно состоит из простого stackpanel расположения с несколькими кнопками. Событие Click каждой кнопки в настоящее время присваивается тому же обработчику событий, за исключением того, что я изменяю Свойство тегов, чтобы сделать простой (дрянной) параметр команды. Я борюсь с "корректным" способом сделать это в MVVM, потому что способ, которым я делаю его теперь, довольно ужасен.
Для решения этого я думаю, что это - направление, которое я должен возглавить в, но ценил бы любой дополнительный вход, который можно предложить мне.:)
Создайте Всплывающее окно в XAML. Так как мое Раскрывающееся содержание статично, я должен быть в состоянии создать Всплывающее окно полностью в XAML. Кроме того, каждая кнопка была бы связана с тем же ICommand-производным-классом. например.
<Popup x:Key="MyPopup" StaysOpen="False" Placement="Right">
<Border Background="White" BorderBrush="Black" Padding="5" BorderThickness="2" CornerRadius="5">
<StackPanel Orientation="Vertical">
<Button Command="{Binding MyCommand}" CommandParameter="5">5</Button>
<Button Command="{Binding MyCommand}" CommandParameter="10">10</Button>
<Button Command="{Binding MyCommand}" CommandParameter="15">15</Button>
<Button Command="{Binding MyCommand}" CommandParameter="20">20</Button>
</StackPanel>
</Border>
</Popup>
Сделайте Раскрывающееся всплывающее окно через Триггер, например.
<Button.Triggers>
<Trigger Property="Button.IsMouseOver" Value="True">
<Setter TargetName="MyPopup" Property="IsOpen" Value="True" />
</Trigger>
</Button.Triggers>
Я думаю, что № 1 в порядке, но я борюсь с № 2. Действительно ли это - правильный способ приблизиться к проблеме? И если так, каков корректный синтаксис XAML для того, чтобы заставлять свойство Popup's IsOpen иметь значение true? Я не мог найти примеры для этого.
Если мои целые взгляды испорчены, я хотел бы услышать, каковы мои другие опции. Спасибо!
Вот что я сделаю, сначала я разобью свои многоразовые части на ресурсы, и буду ссылаться на них, используя ContentControls
в XAML. Это относится к Popup
, а также к кнопке Button
. Однако я не хочу ограничиваться только кнопкой, поэтому я буду использовать ContentControl
и для этого:
Всплывающее окно:
<ControlTemplate x:Key="PopupTemplate">
<Border
Background="White"
BorderBrush="Black"
Padding="5"
BorderThickness="2"
CornerRadius="5">
<StackPanel Orientation="Vertical">
<Button Command="{Binding MyCommand}"
CommandParameter="5">5</Button>
<Button Command="{Binding MyCommand}"
CommandParameter="10">10</Button>
<Button Command="{Binding MyCommand}"
CommandParameter="15">15</Button>
<Button Command="{Binding MyCommand}"
CommandParameter="20">20</Button>
</StackPanel>
</Border>
</ControlTemplate>
Шаблон ContentControl
:
<ControlTemplate x:Key="MyControlTemplate" TargetType="ContentControl">
<Grid Name="MyControl">
<ContentPresenter Content="{TemplateBinding Content}"/>
<Popup Name="MyPopup" StaysOpen="True" Placement="Bottom">
<ContentControl Template="{StaticResource PopupTemplate}"/>
</Popup>
</Grid>
<ControlTemplate.Triggers>
<Trigger SourceName="MyControl"
Property="UIElement.IsMouseOver"
Value="True">
<Setter TargetName="MyPopup"
Property="Popup.IsOpen"
Value="True"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
Теперь в главном окне XAML я создам следующее:
<ContentControl Template="{StaticResource MyControlTemplate}">
<Button Content="Test"/>
</ContentControl>
Если у вас есть вопросы, я с удовольствием отвечу на них.
.