2017-08-01 66 views
0

我的问题访问ScaleTransform这是在ListBox从代码隐藏

我想一个ScaleTransform添加到我的画布,并试图在我看来后面的代码加入对它的代码。但是,虽然VisualStudio向我显示访问者,但当我尝试在后面的代码中使用它时会引发错误。

我的列表框看起来是这样的:

<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> 

代码隐藏:

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; 
     } 
    } 

Visual Studio中不断告诉我, St不在当前可用的上下文中。

我在做什么错?

回答

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; 
    } 
}