如何强制控件在wpf中保持在窗口内?

时间:2017-09-20 09:23:35

标签: c# wpf visual-studio

我有一个wpf应用程序,其中有一个网格,并且有一个按钮。每次用鼠标按下按钮,它都会转到另一个随机位置。调整大小很有效,直到按钮位于右下方,调整大小后才会消失

<Grid x:Name="MainGrid" MinWidth="60" MinHeight="60" Margin="0">
    <Button x:Name="btn" Content="Button" Click="Button_Click" MouseEnter="MouseEnter_btn" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0,0,67,149"/>
</Grid>

    private void MouseEnter_btn(object sender, MouseEventArgs e)
    {
        Random rng = new Random();
        double x = (MainGrid.ActualWidth - btn.ActualWidth) - rng.Next(1, (int)(MainGrid.ActualWidth - btn.ActualWidth));
        double y = (MainGrid.ActualHeight - btn.ActualHeight) - rng.Next(1, (int)(MainGrid.ActualHeight - btn.ActualHeight));
        btn.Margin = new Thickness(x, y, 1, 1);
    }

1 个答案:

答案 0 :(得分:0)

这是一个解决方案,应该可以满足您的需求:

<Grid x:Name="MainGrid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="100" x:Name="XOffset"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="100" x:Name="YOffset"/>
    </Grid.RowDefinitions>

    <Button x:Name="btn" Content="Button" 
            MouseEnter="MouseEnter_btn"
            Grid.Row="1"
            Grid.Column="1"/>
</Grid>

在代码中只需更改XOffset和YOffset

private void MouseEnter_btn(object sender, MouseEventArgs e)
{
    Random rng = new Random();
    Size availableSize = new Size(MainGrid.ActualWidth - btn.ActualWidth, MainGrid.ActualHeight - btn.ActualHeight);

    int x = rng.Next(1,(int)availableSize.Width);
    int y = rng.Next(1, (int)availableSize.Height);

    XOffset.Width = new GridLength(x);
    YOffset.Height = new GridLength(y);
}

现在按钮被XOffset和YOffset锁定在右下方,如果它到达左边或上边缘,它将保持在那里,右/底偏移将减少。