WPF通过Grid.Row移动对象吗?

时间:2018-07-19 09:07:22

标签: c# wpf xaml mvvm caliburn.micro

我有一个问题,如何按行移动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>

感谢您的建议!

2 个答案:

答案 0 :(得分:0)

首先将每个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中,行号可以被视为 view ,而不是 ViewModel 。因此,首先您需要确定要走的路。

  1. 您可以在 ViewModel 中添加这些可绑定属性,并通过命令对其进行修改。

  2. 您可以将它们直接添加到 view 的代码隐藏(MyWindow.xaml.cs或MyUserControl.xaml.cs)中,并通过事件处理程序修改它们

在第二种情况下:

  1. 您可能会忘记绑定,而只是按照Clemens的建议使用Grid.SetRow(Button2, 3);

  2. 或者您可以对这些修改使用绑定:

    • 将托管网格的用户控件(或窗口)的x:Name设置为,例如MyUserControlRoot
    • ElementName添加到绑定中。 例如Grid.Row="{Binding ElementName=MyUserControlRoot, Path=Button1Row}"

答案 1 :(得分:0)

您可以声明一个按钮样式,该按钮样式根据ContentControl的Grid.Row是否为null来设置Content属性值:

<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>