c# - 仅将 LayoutTransform 应用于父级而不应用于任何特定的子级

标签 c# wpf

主窗口.XAML:

<Window x:Class="TestWPFApp.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Name="myMainWindow"
            Title="MainWindow" Width="200" Height="250">
        <Grid Name="MainGrid" SizeChanged="MainGrid_SizeChanged">
            <Grid.LayoutTransform>
                <ScaleTransform x:Name="ApplicationScaleTransform"
                            CenterX="0"
                            CenterY="0"
                            ScaleX="{Binding ElementName=myMainWindow, Path=ScaleValue}"
                            ScaleY="{Binding ElementName=myMainWindow, Path=ScaleValue}" />
            </Grid.LayoutTransform>
            <Grid VerticalAlignment="Center" HorizontalAlignment="Center" Height="150">
                <TextBlock FontSize="20" Text="Hello World" Margin="5" VerticalAlignment="Top" HorizontalAlignment="Center"/>
                <Button Content="Button" VerticalAlignment="Bottom" HorizontalAlignment="Center" Name="myButton"/>
            </Grid>
        </Grid>

    </Window>

主窗口代码隐藏:

 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        #region ScaleValue Depdency Property
        public static readonly DependencyProperty ScaleValueProperty = DependencyProperty.Register("ScaleValue", typeof(double), typeof(MainWindow), new UIPropertyMetadata(1.0, new PropertyChangedCallback(OnScaleValueChanged), new CoerceValueCallback(OnCoerceScaleValue)));

        private static object OnCoerceScaleValue(DependencyObject o, object value)
        {
            MainWindow mainWindow = o as MainWindow;
            if (mainWindow != null)
                return mainWindow.OnCoerceScaleValue((double)value);
            else
                return value;
        }

        private static void OnScaleValueChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            MainWindow mainWindow = o as MainWindow;
            if (mainWindow != null)
                mainWindow.OnScaleValueChanged((double)e.OldValue, (double)e.NewValue);
        }

        protected virtual double OnCoerceScaleValue(double value)
        {
            if (double.IsNaN(value))
                return 1.0f;

            value = Math.Max(0.1, value);
            return value;
        }

        protected virtual void OnScaleValueChanged(double oldValue, double newValue)
        {

        }

        public double ScaleValue
        {
            get
            {
                return (double)GetValue(ScaleValueProperty);
            }
            set
            {
                SetValue(ScaleValueProperty, value);
            }
        }
        #endregion

        private void MainGrid_SizeChanged(object sender, EventArgs e)
        {
            CalculateScale();
        }

        private void CalculateScale()
        {
            double yScale = ActualHeight / 250f;
            double xScale = ActualWidth / 200f;
            double value = Math.Min(xScale, yScale);
            ScaleValue = (double)OnCoerceScaleValue(MainGrid, value);
        }
    }

我有这个示例应用程序。我在 MainGrid 上应用 LayoutTransform 以通过调整窗口大小来缩放应用程序。我怎样才能避免我的控件 myButton 应用该转换?我不希望在其上应用该转换。

最佳答案

两种选择

1) 不要让它成为 child ,而只是让它在视觉上重叠,例如使用第二个网格。

2) 对 child 应用逆转换,这将否定转换,可能会很昂贵但应该可以解决问题。

<Button LayoutTransform="{Binding ElementName=MainGrid, Path=LayoutTransform.Inverse}"/>

我个人会使用第一个选项。

关于c# - 仅将 LayoutTransform 应用于父级而不应用于任何特定的子级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10913391/

相关文章:

c# - 在 C# 中引用另一个字符串

c# - 如何指定“字符

c# - 对一个集合进行分组并返回一个字典

wpf - 裁剪任意 wpf 几何图形

c# - 将项目添加到底层 ObservableCollection 时,递归 TreeView 不保留结构

c# - 在 WinRT 中使用 DataTemplate 将表头添加到 Listview

c# - 从 C# 项目制作 DLL?

c# - 在运行时从字符串创建数学函数

c# - 类似于 WPF 的 Firebug 工具?

c# - WPF 使用 x :Name as a key 绑定(bind)到字典