1

我有一个大致如下布局的 WPF 控件:

<ViewBox Stretch="Uniform" Name="viewboxName">
    <ItemsControl>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <!-- a bunch of controls here that I want stretched in the viewbox -->
             </DataTemplate>
         </ItemsControl.ItemTemplate>
    </ItemsControl>
</ViewBox>

然后,在 AdornerLayer 中,我有一个按钮控件(使用基于http://shevaspace.blogspot.com/2007/02/visual-level-programming-vs-logical.html的技术)定义为

<Button>
    <Image Source="/AcchImageLoad;component/icons/metroStudio/ImageRotation.png" Stretch="None" />
</Button>

如何在 AdornerLayer 中获取此按钮以使用图像的原始分辨率,而不是使用 ViewBox 进行拉伸?

4

2 回答 2

1

ViewBox基本上,这个想法是使用绑定转换器从 中获取变换并应用逆。

绑定转换器可以使用以下代码得到相反的结果:

((ContainerVisual)VisualTreeHelper
.GetChild((System.Windows.DependencyObject)viewbox, 0)).Transform.Inverse

在 xaml 中,绑定看起来像

<Button.LayoutTransform>
    <MultiBinding Converter="{bc:ExemptFromViewboxTransformConverter}">
       <Binding Source="{x:Reference Name=viewboxName}" />
       <!-- The ActualWidth/ActualHeight bindings are only used to ensure 
            the transform updates when the window is resized. -->
        <Binding Source="{x:Reference Name=viewboxName}" Path="ActualWidth" />
        <Binding Source="{x:Reference Name=viewboxName}" Path="ActualHeight" />
    </MultiBinding>
</Button.LayoutTransform>

也可以看看:

于 2013-05-09T21:11:21.173 回答
0

您可以使用此解决方案禁用视图框缩放:禁用特定元素的视图框调整大小

基本上,为 ViewBox_SizeChanged 添加一个处理程序,并将豁免元素的变换设置为 ViewBox 变换的倒数。

然后在您的 XAML 中,添加 ViewBoxExtra.DisableScaling="true",例如

<Rectangle Width="50" Height="50" local:ViewBoxExtra.DisableScaling="true"/>
于 2018-01-05T10:39:00.353 回答