Как получить доступ к элементу управления, который определен в стиле - PullRequest
1 голос
/ 16 сентября 2011

У меня есть CustomControl, который использует ScrollViewer.Следующий код является примером, который показывает мой вариант использования простым способом:

<Style TargetType="controls:MyCustomControl">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="controls:MyCustomControl">
        <Grid x:Name="LayoutRoot" Background="White">
          <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="20"/>
            <RowDefinition Height="20"/>
          </Grid.RowDefinitions>
          <ScrollViewer x:Name="scrollViewer" Grid.Row="0"
                        Height="300" Width="400"
                        VerticalScrollBarVisibility="Auto" 
                        HorizontalScrollBarVisibility="Auto"
                        Style="{StaticResource ScrollViewerStyle}">
            <Canvas x:Name="outer" Width="400" Height="400"
                    Background="Red" Margin="50">
              <Canvas x:Name="inner" Background="Green" 
                      Width="400" Height="400">
                <Canvas.RenderTransform>
                  <ScaleTransform ScaleX="{Binding Value, ElementName=slider}"
                                  ScaleY="{Binding Value, ElementName=slider}"/>
                </Canvas.RenderTransform>
              </Canvas>
            </Canvas>
          </ScrollViewer>
        <Slider x:Name="slider" Minimum="0.1" Maximum ="10"
                Value="1" Grid.Row="2"/>
      </Grid>
    </ControlTemplate>
  </Setter.Value>
</Setter>

Я не учел несоответствующий CodeBehind, принадлежащий Slider.ValueChanged.

Inеще один вопрос, который я задаю Как мне вставить элементы управления в ScrollViewer .В этом ответе у меня появилась идея шаблонизировать ScrollViewer.Я добавил некоторые элементы в ScrollViewer, как показано в ответе.Например, у меня есть новый Canvas внутри моего ScrollViewer:

<Canvas x:Name="canvas"/>

Мне нужен доступ к этому Canvas во время выполнения, поэтому в WPF я создал:

public class MyScrollViewer : ScrollViewer

Я переопределяю OnApplyTemplate и получаю к нему доступ через GetTemplateChild.Итак, все сделано.

В SL этот способ невозможен, поскольку ScrollViewer запечатан.

Теперь я ищу другой способ получить доступ.Я надеялся, что VisualTreeHelper поможет мне, но я не получаю Canvas.Ни в CodeBehind моего пользовательского элемента управления, ни в codebehind-ах моей MainPage (где я использую свой элемент управления).

private void GetCanvas(DependencyObject dependencyObject)
  {
    int count = VisualTreeHelper.GetChildrenCount(dependencyObject);
    for (int i = 0; i < count; i++)
    {
      DependencyObject child = VisualTreeHelper.GetChild(dependencyObject);
      Canvas canvas = child as Canvas;
      if (canvas == null)
      {
        GetCanvas(child);
      }
      else
      {
        // Code here if found
      }
    }
  }

Тогда коллега помнит меня, что существует директива x: FieldModifier.Я никогда не использовал это раньше, только слышал об этом.Я даю ему попытку.

x:FieldModifier="public"

Но не знаю, действительно ли это даст мне возможность получить доступ из-за кода, еще меньше как.

Итак, есть ли способ, как я мог получить доступна моем холсте во время выполнения в Silverlight?Может быть, есть другое решение в самом WPF, которое также работает на SL?

1 Ответ

1 голос
/ 16 сентября 2011

В Silverlight это возможно с помощью метода расширения GetVisualDescendants (DependencyObject) в наборе инструментов Silverlight. Следующие должны работать ...

  • Добавить ссылку на System.Windows.Controls.Primitives
  • Добавить с помощью System.Windows.Controls.Primitives
  • Вызовите scrollViewer.GetVisualDescendants (). OfType (). FirstOrDefault (canvas => canvas.Name.Equals ("yourCanvasName")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...