从CodeBehind访问ListBox中的ScaleTransform

时间:2017-08-01 12:33:14

标签: c# wpf canvas listbox

我的问题

我想在我的Canvas中添加一个ScaleTransform,并尝试在我的视图后面的代码中添加代码。但是,当VisualStudio向我显示访问器时,当我尝试在后面的代码中使用它时会抛出错误。

我的ListBox看起来像这样:

Apache Ant(TM) version 1.9.6 compiled on July 8 2015

重要的部分是:

<Grid>
    <cc:ListBoxNoDragSelection ItemsSource="{Binding MainModel.Rectangles}" Background="{DynamicResource  BG}" SelectedItem="{Binding Selected}"
                               BorderThickness="0" x:Name="ListBoxNoDragSelection">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas x:Name="MockupCanvas" MouseWheel="MockupCanvas_OnMouseWheel" Background="Transparent">
                    <Canvas.RenderTransform>
                        <ScaleTransform x:Name="St"/>
                    </Canvas.RenderTransform>
                    <Canvas.ContextMenu>
                        <ContextMenu>
                            <MenuItem Header="New rectangle" Command="{Binding AddNewRectangleToCollectionCommand}"/>
                            <MenuItem Header="Delete selected rectangle" Command="{Binding TryDeleteRectangleFromCollectionCommand}"/>
                        </ContextMenu>
                    </Canvas.ContextMenu>
                </Canvas>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Setter Property="Canvas.Left" Value="{Binding X}"/>
                <Setter Property="Canvas.Top" Value="{Binding Y}"/>
                <Setter Property="Canvas.ZIndex" Value="{Binding Z}"/>
            </Style>
        </ListBox.ItemContainerStyle>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <DockPanel Height="Auto" Width="{Binding Width}">
                    <Label DockPanel.Dock="Top" Content="{Binding Name}" Foreground="{DynamicResource Foreground}" IsHitTestVisible="False"/>
                    <Rectangle Width="{Binding Width}" Height="{Binding Height}"  DockPanel.Dock="Bottom"
                               Fill="Transparent" Stroke="White" StrokeThickness="3" RadiusX="10" RadiusY="10" />
                </DockPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </cc:ListBoxNoDragSelection>
</Grid>

代码隐藏:

<Canvas x:Name="MockupCanvas" MouseWheel="MockupCanvas_OnMouseWheel" Background="Transparent">
                    <Canvas.RenderTransform>
                        <ScaleTransform x:Name="St"/>
                    </Canvas.RenderTransform>
                    <Canvas.ContextMenu>
                        <ContextMenu>
                            <MenuItem Header="New rectangle" Command="{Binding AddNewRectangleToCollectionCommand}"/>
                            <MenuItem Header="Delete selected rectangle" Command="{Binding TryDeleteRectangleFromCollectionCommand}"/>
                        </ContextMenu>
                    </Canvas.ContextMenu>
                </Canvas>

Visual Studio一直告诉我private void MockupCanvas_OnMouseWheel(object sender, MouseWheelEventArgs e) { if (e.Delta > 0) { St.ScaleX *= ScaleRate; St.ScaleY *= ScaleRate; } else { St.ScaleX /= ScaleRate; St.ScaleY /= ScaleRate; } } 不在当前上下文中。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您可以从画布中取出ScaleTransform,而不是按名称访问它:

private void MockupCanvas_OnMouseWheel(object sender, MouseWheelEventArgs e)
{
    var scaleTransformation = (sender as Canvas)?.RenderTransform as ScaleTransform;

    if (scaleTransformation == null)
        return;
    if (e.Delta > 0)
    {
        scaleTransformation.ScaleX *= ScaleRate;
        scaleTransformation.ScaleY *= ScaleRate;
    }
    else
    {
        scaleTransformation.ScaleX /= ScaleRate;
        scaleTransformation.ScaleY /= ScaleRate;
    }
}