У меня вопрос, как перемещать объекты в приложении WPF по строкам? Мой Xaml выглядит так:
<Grid>
<Grid.ColumnDefinitions>
<Some columns here!/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<Some Rows here!/>
</Grid.RowDefinitions>
<Button x:Name = "Button1"
Grid.Row = "1" Grid.Column = "4"
Width = "50" Height = "50"
Content = "Button1"
Foreground = "White"
BorderThickness = "0"
Style = "{StaticResource {x:Static ToolBar.ButtonStyleKey}}"
BorderBrush = "{x:Null}"
Background = "#FF085078"/>
<Button x:Name = "Button2"
Grid.Row = "2" Grid.Column = "4"
Content = "Button2"
Foreground = "White"
BorderThickness = "0"
Style = "{StaticResource {x:Static ToolBar.ButtonStyleKey}}"
BorderBrush = "{x:Null}"
Background = "#FF085078"/>
<ContentControl Grid.Row = "1" Grid.Column = "2" Grid.RowSpan = "2" Grid.ColumnSpan = "3"
x:Name = "ActiveItem"/>
Что я хочу сделать, это когда я показываю другое окно в элементе управления содержимым, я хочу переместить «Button2» во второе представление элемента управления содержимым. Как перемещать элементы под контролем, и когда я закрываю второй вид, элементы возвращаются на свои основные места? Как связать Grid.Row таким образом, чтобы делать то, что я хочу? Если это поможет, я работаю с Caliburn.Micro Framework>
Спасибо за советы!
вы также можете привязать Grid.Row к привязываемому свойству
@Clemens Да, это именно то, что я хочу!
@Bijan Вы можете объяснить, как правильно привязать SetRow? Бьюсь об заклад, мне нужно создать метод для движущихся объектов, а затем в методе, чтобы показать ContentControl, вызывая этот метод для движущихся объектов.
Если вы хотите переместить кнопку, когда ContentControl Content не имеет значения NULL, вы также можете использовать стиль кнопки с DataTrigger в качестве чистого решения XAML.
@ Клеменс, не могли бы вы привести пример того, что вы объяснили?





Сначала привяжите каждый Grid.Row к привязываемому свойству.
<Grid>
<Grid.ColumnDefinitions>
<Some columns here!/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<Some Rows here!/>
</Grid.RowDefinitions>
<Button x:Name = "Button1"
Grid.Row = "{Binding Button1Row}" Grid.Column = "4"
Width = "50" Height = "50"
Content = "Button1" />
<Button x:Name = "Button2"
Grid.Row = "{Binding Button2Row}" Grid.Column = "4"
Width = "50" Height = "50"
Content = "Button2"/>
<ContentControl Grid.Row = "{Binding ContentControlRow}" Grid.Column = "2" Grid.RowSpan = "2" Grid.ColumnSpan = "3"
x:Name = "ActiveItem"/>
</Grid>
Теперь в вашем объекте, привязанном к DataContext, вам нужно определить эти связываемые свойства.
Обратите внимание, что в MVVM номер строки может рассматриваться как Посмотреть, а не как ViewModel. Итак, сначала вам нужно решить, по какому пути вы хотите пойти.
Вы можете добавить эти связываемые свойства в ViewModel и изменить их с помощью команда.
Вы можете добавить их непосредственно в код программной части Посмотреть (MyWindow.xaml.cs или MyUserControl.xaml.cs) и изменить их с помощью обработчик события.
Во втором случае:
Вы можете забыть о привязке и просто использовать Grid.SetRow(Button2, 3);, как предлагал Клеменс.
Или вы можете использовать привязку с этими модификациями:
x:Name пользовательского элемента управления (или окна), в котором размещена сетка, значение например MyUserControlRoot.ElementName в привязки. например Grid.Row = "{Binding ElementName=MyUserControlRoot, Path=Button1Row}"Вы можете объявить стиль кнопки, который устанавливает значение свойства Grid.Row в зависимости от того, является ли Content ContentControl нулевым или нет:
<Button Content = "Button2" Grid.Column = "4">
<Button.Style>
<Style TargetType = "Button">
<Setter Property = "Grid.Row" Value = "3"/>
<Style.Triggers>
<DataTrigger Binding = "{Binding Content, ElementName=ActiveItem}"
Value = "{x:Null}">
<Setter Property = "Grid.Row" Value = "2"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
Если уже есть стиль, назначенный
<Button Style = "{StaticResource X}" .../>
удалите его и напишите это:
<Button ...>
<Button.Style>
<Style TargetType = "Button" BasedOn = "{StaticResource X}">
...
</Style>
</Button.Style>
</Button>
Выглядит довольно просто в использовании, спасибо! Но что делать, когда VS кричит мне, что свойство "Style" установлено более одного раза, и я не могу добраться до тела <Button.Style>? Та же история со значением «Контент». Я обновил шаблон кнопок в основном посте
Вы можете установить свойство только один раз. Либо через тег атрибута <Control Prop = "X", либо как собственный узел <Control.Prop>. Удалите тот, который вам не нужен. @ metadon789
У меня есть еще один вопрос: что, если я хочу иметь несколько триггеров данных, как указано выше? @Clemens
Grid.SetRow(Button2, 3);- это не то, что вам нужно?