为什么 ViewBox 不适合自己内部的所有内容?

问题描述

我有一些繁忙的 xaml 表示绕轴的方向。到目前为止,它运行良好,但现在。

基本上它是一个自定义的多边形,绕圆旋转 8 次:

<UserControl x:Class="NameSpace.OrientationEditor"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Namespace.SensorOrientationEditor"
             xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
             xmlns:resources="clr-namespace:Namespace.Resources"
             xmlns:converters="clr-namespace:Namespace.Converters"
             mc:Ignorable="d" Margin="0"
             Width="86" Height="86">
    <UserControl.Resources>
        <local:SensorOrientationorientationdisplayConverter x:Key="SensorOrientationorientationdisplayConverter"/>
        <converters:CollectionContainsToBooleanConverter x:Key="CollectionContainsToBooleanConverter"/>
    </UserControl.Resources>
    <Grid  Width="86" Height="86" Name="RootContainer">
        <Grid.DataContext>
            <local:OrientationEditorviewmodel/>
        </Grid.DataContext>
        
        <Canvas Margin="0" >
            <Canvas.Resources>
                <Style targettype="polygon" x:Key="polygonStyle">
                    <Setter Property="Fill" Value="{Binding Source={x:Static resources:CompanyColors.Instance},Path=INACTIVE_BACKGROUND_COLOR}" />
                    <Style.Triggers>
                        <Trigger Property="IsMouSEOver" Value="True">
                            <Setter Property="Fill" Value="{Binding Source={x:Static resources:CompanyColors.Instance},Path=PRIMARY_FOREGROUND_COLOR}"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
                <Style targettype="Ellipse" x:Key="EllipseStyle">
                    <Setter Property="stroke" Value="{Binding Source={x:Static resources:CompanyColors.Instance},Path=WHITE_FOREGROUND}" />
                </Style>
                <Style targettype="Ellipse" x:Key="CenterEllipseStyle" >
                    <Setter Property="Fill" Value="{Binding Source={x:Static resources:CompanyColors.Instance},Path=PRIMARY_FOREGROUND_COLOR}"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Canvas.Resources>
            <!-- Top element-->
            <Button Command="{Binding SelectNewOrientationCommand}" CommandParameter="{x:Static local:OrientationEditorDirection.Top}" >
                <Button.Visibility>
                    <MultiBinding Converter="{StaticResource SensorOrientationorientationdisplayConverter}" ConverterParameter="{x:Static local:OrientationEditorDirection.Top}">
                        <Binding Path="ReadOnly"></Binding>
                        <Binding Path="SelectedDirections"></Binding>
                    </MultiBinding>
                </Button.Visibility>
                <Button.Template>
                    <ControlTemplate>
                        <polygon Points="4,0 8,6 12,24 0,6 4,6"  RenderTransformOrigin="0.5,1.75" >
                            <polygon.Resources>
                                <Style targettype="polygon" BasedOn="{StaticResource polygonStyle}">
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding SelectedDirections,Converter={StaticResource CollectionContainsToBooleanConverter},ConverterParameter={x:Static local:OrientationEditorDirection.Top}}" Value="True" >
                                            <Setter Property="Fill" Value="{Binding Color}" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </polygon.Resources>
                            <polygon.RenderTransform>
                                <TransformGroup>
                                    <TranslateTransform X="40" Y="4"/>
                                </TransformGroup>
                            </polygon.RenderTransform>
                        </polygon>
                    </ControlTemplate>
                </Button.Template>
            </Button>

            <!-- Top-right element-->
            <Button Command="{Binding SelectNewOrientationCommand}" CommandParameter="{x:Static local:OrientationEditorDirection.TopRight}" >
                <Button.Visibility>
                    <MultiBinding Converter="{StaticResource SensorOrientationorientationdisplayConverter}" ConverterParameter="{x:Static local:OrientationEditorDirection.TopRight}">
                        <Binding Path="ReadOnly"></Binding>
                        <Binding Path="SelectedDirections"></Binding>
                    </MultiBinding>
                </Button.Visibility>
                <Button.Template>
                    <ControlTemplate>
                        <polygon Points="4,1.75" >
                            <polygon.Resources>
                                <Style targettype="polygon" BasedOn="{StaticResource polygonStyle}">
                                    <Style.Triggers>
                                        <DataTrigger  Binding="{Binding SelectedDirections,ConverterParameter={x:Static local:OrientationEditorDirection.TopRight}}" Value="True"  >
                                            <Setter Property="Fill" Value="{Binding Color}" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </polygon.Resources>
                            <polygon.RenderTransform>
                                <TransformGroup>
                                    <RotateTransform Angle="45"/>
                                    <TranslateTransform X="40" Y="4"/>
                                </TransformGroup>
                            </polygon.RenderTransform>
                        </polygon>
                    </ControlTemplate>
                </Button.Template>
            </Button>

            <!-- Right element-->
            <Button Command="{Binding SelectNewOrientationCommand}" CommandParameter="{x:Static local:OrientationEditorDirection.Right}" >
                <Button.Visibility>
                    <MultiBinding Converter="{StaticResource SensorOrientationorientationdisplayConverter}" ConverterParameter="{x:Static local:OrientationEditorDirection.Right}">
                        <Binding Path="ReadOnly"></Binding>
                        <Binding Path="SelectedDirections"></Binding>
                    </MultiBinding>
                </Button.Visibility>
                <Button.Template>
                    <ControlTemplate>
                        <polygon Points="4,ConverterParameter={x:Static local:OrientationEditorDirection.Right}}" Value="True" >
                                            <Setter Property="Fill" Value="{Binding Color}" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </polygon.Resources>
                            <polygon.RenderTransform>
                                <TransformGroup>
                                    <RotateTransform Angle="90"/>
                                    <TranslateTransform X="40" Y="4"/>
                                </TransformGroup>
                            </polygon.RenderTransform>
                        </polygon>
                    </ControlTemplate>
                </Button.Template>
            </Button>

            <!-- Bottom-Right element-->
            <Button Command="{Binding SelectNewOrientationCommand}" CommandParameter="{x:Static local:OrientationEditorDirection.Bottomright}" >
                <Button.Visibility>
                    <MultiBinding Converter="{StaticResource SensorOrientationorientationdisplayConverter}" ConverterParameter="{x:Static local:OrientationEditorDirection.Bottomright}">
                        <Binding Path="ReadOnly"></Binding>
                        <Binding Path="SelectedDirections"></Binding>
                    </MultiBinding>
                </Button.Visibility>
                <Button.Template>
                    <ControlTemplate>
                        <polygon Points="4,6" RenderTransformOrigin="0.5,ConverterParameter={x:Static local:OrientationEditorDirection.Bottomright}}" Value="True"  >
                                            
                                            <Setter Property="Fill" Value="{Binding Color}" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </polygon.Resources>
                            <polygon.RenderTransform>
                                <TransformGroup>
                                    <RotateTransform Angle="135"/>
                                    <TranslateTransform X="40" Y="4"/>
                                </TransformGroup>
                            </polygon.RenderTransform>
                        </polygon>
                    </ControlTemplate>
                </Button.Template>
            </Button>

            <!-- Bottom element-->
            <Button Command="{Binding SelectNewOrientationCommand}" CommandParameter="{x:Static local:OrientationEditorDirection.Bottom}" >
                <Button.Visibility>
                    <MultiBinding Converter="{StaticResource SensorOrientationorientationdisplayConverter}" ConverterParameter="{x:Static local:OrientationEditorDirection.Bottom}">
                        <Binding Path="ReadOnly"></Binding>
                        <Binding Path="SelectedDirections"></Binding>
                    </MultiBinding>
                </Button.Visibility>
                <Button.Template>
                    <ControlTemplate>
                        <polygon Points="4,ConverterParameter={x:Static local:OrientationEditorDirection.Bottom}}" Value="True"  >
                                            <Setter Property="Fill" Value="{Binding Color}" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </polygon.Resources>
                            <polygon.RenderTransform>
                                <TransformGroup>
                                    <RotateTransform Angle="180"/>
                                    <TranslateTransform X="40" Y="4"/>
                                </TransformGroup>
                            </polygon.RenderTransform>
                        </polygon>
                    </ControlTemplate>
                </Button.Template>
            </Button>

            <!-- Bottom-left element-->
            <Button Command="{Binding SelectNewOrientationCommand}" CommandParameter="{x:Static local:OrientationEditorDirection.BottomLeft}" >
                <Button.Visibility>
                    <MultiBinding Converter="{StaticResource SensorOrientationorientationdisplayConverter}" ConverterParameter="{x:Static local:OrientationEditorDirection.BottomLeft}">
                        <Binding Path="ReadOnly"></Binding>
                        <Binding Path="SelectedDirections"></Binding>
                    </MultiBinding>
                </Button.Visibility>
                <Button.Template>
                    <ControlTemplate>
                        <polygon Points="4,ConverterParameter={x:Static local:OrientationEditorDirection.BottomLeft}}" Value="True"  >
                                            <Setter Property="Fill" Value="{Binding Color}" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </polygon.Resources>
                            <polygon.RenderTransform>
                                <TransformGroup>
                                    <RotateTransform Angle="225"/>
                                    <TranslateTransform X="40" Y="4"/>
                                </TransformGroup>
                            </polygon.RenderTransform>
                        </polygon>
                    </ControlTemplate>
                </Button.Template>
            </Button>

            <!-- Left element-->
            <Button Command="{Binding SelectNewOrientationCommand}" CommandParameter="{x:Static local:OrientationEditorDirection.Left}" >
                <Button.Visibility>
                    <MultiBinding Converter="{StaticResource SensorOrientationorientationdisplayConverter}" ConverterParameter="{x:Static local:OrientationEditorDirection.Left}">
                        <Binding Path="ReadOnly"></Binding>
                        <Binding Path="SelectedDirections"></Binding>
                    </MultiBinding>
                </Button.Visibility>
                <Button.Template>
                    <ControlTemplate>
                        <polygon Points="4,ConverterParameter={x:Static local:OrientationEditorDirection.Left}}" Value="True"  >
                                            <Setter Property="Fill" Value="{Binding Color}" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </polygon.Resources>
                            <polygon.RenderTransform>
                                <TransformGroup>
                                    <RotateTransform Angle="270"/>
                                    <TranslateTransform X="40" Y="4"/>
                                </TransformGroup>
                            </polygon.RenderTransform>
                        </polygon>
                    </ControlTemplate>
                </Button.Template>
            </Button>

            <!-- Top-Left element-->
            <Button Command="{Binding SelectNewOrientationCommand}" CommandParameter="{x:Static local:OrientationEditorDirection.TopLeft}" >
                <Button.Visibility>
                    <MultiBinding Converter="{StaticResource SensorOrientationorientationdisplayConverter}" ConverterParameter="{x:Static local:OrientationEditorDirection.TopLeft}">
                        <Binding Path="ReadOnly"></Binding>
                        <Binding Path="SelectedDirections"></Binding>
                    </MultiBinding>
                </Button.Visibility>
                <Button.Template>
                    <ControlTemplate>
                        <polygon Points="4,ConverterParameter={x:Static local:OrientationEditorDirection.TopLeft}}" Value="True"  >
                                            
                                            <Setter Property="Fill" Value="{Binding Color}" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </polygon.Resources>
                            <polygon.RenderTransform>
                                <TransformGroup>
                                    <RotateTransform Angle="315"/>
                                    <TranslateTransform X="40" Y="4"/>
                                </TransformGroup>
                            </polygon.RenderTransform>
                        </polygon>
                    </ControlTemplate>
                </Button.Template>
            </Button>

            <!-- Circle around center-->
            <Ellipse Height="28"  Width="28"  Canvas.Left="32" Canvas.Top="32" Style="{StaticResource EllipseStyle}"/>

            <!-- Circle around center-->
            <Button Command="{Binding SelectNewOrientationCommand}" CommandParameter="{x:Static local:OrientationEditorDirection.Center}" Canvas.Left="39" Canvas.Top="39" >
                
                <Button.Visibility>
                    <MultiBinding Converter="{StaticResource SensorOrientationorientationdisplayConverter}" ConverterParameter="{x:Static local:OrientationEditorDirection.Center}">
                        <Binding Path="ReadOnly"></Binding>
                        <Binding Path="SelectedDirections"></Binding>
                        <Binding Path="AllowCenterPosition" RelativeSource="{RelativeSource FindAncestor,AncestorType={x:Type UserControl}}"></Binding>
                    </MultiBinding>
                </Button.Visibility>
                <Button.Template>
                    <ControlTemplate>
                        <Ellipse Height="14"  Width="14">
                            <Ellipse.Resources>
                                <Style targettype="Ellipse" BasedOn="{StaticResource CenterEllipseStyle}">
                                    <Style.Triggers>
                                        <DataTrigger  Binding="{Binding SelectedDirections,ConverterParameter={x:Static local:OrientationEditorDirection.Center}}" Value="True"  >
                                            <Setter Property="Fill" Value="{Binding Color}" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </Ellipse.Resources>
                        </Ellipse>
                    </ControlTemplate>
                </Button.Template>
            </Button>
        </Canvas>
    </Grid>
</UserControl>

我需要在另一个组件中重用它,它应该适合更小的尺寸。 所以我尝试在我的组件周围使用一个 ViewBox,以适应其中的项目。

<ViewBox Width="58" Height="58" Stretch="Fill" >
    <sensorOrientationEditor:OrientationEditor   SelectedDirections="{Binding Directions}" 
                                                 Color="{Binding Probes[0],Converter={StaticResource ColorConverter}}" 
                                                 ReadOnly ="True"  Margin="0"  Padding="0">

    </sensorOrientationEditor:OrientationEditor>
</ViewBox>

它几乎起作用了,但我有一些小部分超出了我的 ViewBox 的大小(与 Visual Studio 检查员确认):

enter image description here

并且圆圈不在 ViewBox 的中心。

知道我错过了什么吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)