【问题标题】:Rotating a border doesn't change window size旋转边框不会改变窗口大小
【发布时间】:2012-06-11 19:07:57
【问题描述】:

我尝试旋转Border 并让MainWindow 根据Border 旋转占用的新空间更改其大小。 我设置了SizeToContent="WidthAndHeight",但是当我旋转边框时窗口大小没有改变。

我是否需要以编程方式为 MainWindow 设置 WidthHeight,或者这可以通过其他方式更改 xaml 代码来实现?

我的 xaml 代码:

<Window x:Class="MyClass.MainWindow"
        WindowStyle="None" AllowsTransparency='True' 
        Topmost='False' Background="Transparent"  ShowInTaskbar='False' 
        SizeToContent="WidthAndHeight" WindowStartupLocation="Manual">
    <Border Name="MyBorder" 
            BorderBrush="Transparent"
            Background="Transparent"
            HorizontalAlignment="Left" 
            VerticalAlignment="Top"
            RenderTransformOrigin="0.5,0.5">
    </Border>
</Windows>

我在Window_KeyDown 上的c# 代码:

# RotateTransform rt = new RotateTransform() 在类级别声明。

if (e.Key == Key.I)
                {
                    if (rt.Angle + 1 < 360)
                    {
                        rt.Angle += 1;                    
                    }
                    else
                    {
                        rt.Angle = 0;                   
                    }    



                MyBorder.RenderTransform = rt;
            }

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    使用LayoutTransform 而不是RenderTransform

    来自 MSDN:Transforms Overview

    • LayoutTransform – 在布局传递之前应用的转换。应用变换后,布局系统处理 元素的大小和位置的变换。

    • RenderTransform – 修改元素外观但在布局传递完成后应用的变换。通过使用 RenderTransform 属性而不是 LayoutTransform 属性,您 可以获得性能优势。

    例子

    <Border Name="MyBorder"  
            BorderBrush="Transparent" 
            Background="Transparent" 
            HorizontalAlignment="Left"  
            VerticalAlignment="Top" 
            RenderTransformOrigin="0.5,0.5">
        <Border.LayoutTransform>
            <RotateTransform Angle="90"/>
        </Border.LayoutTransform>
    </Border>
    

    所以你的情况

    RotateTransform rt = new RotateTransform(0.0, 0.5, 0.5);
    private void Window_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.I)
        {
            if (rt.Angle + 1 < 360)
            {
                rt.Angle += 1;
            }
            else
            {
                rt.Angle = 0;
            }
            MyBorder.LayoutTransform = rt;
        }
    }}
    

    【讨论】:

    • 谢谢!为什么旋转不是从边框的中心?
    • LayoutTransform 中,TranslateTransform 无效。该元素将定位在其父容器中。根据你的情况,HorizontalAlignment="Center"VerticalAlignment="Center" 可能会做你想做的事
    • 我已经在 MSDN 上阅读了足够多的内容,了解我无法使用 LayoutTransform 来实现。我将在旋转过程中使用主窗口位置来模拟效果!。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 2022-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多