Xaml имя области - PullRequest
       4

Xaml имя области

0 голосов
/ 29 марта 2011

Мне нужно изменить атрибут Rectangle с C # (его угол RotateTransform)

Проблема в том, что прямоугольник был объявлен в XAML, а в коде C # он выходит за рамки прямоугольника, я пытался использовать Имя, а X: Имя без успеха,

Как мне это сделать?

------------- Редактировать --------------------

    <ContentControl Width="5" Height="400" Canvas.Top="80" Canvas.Left="350"               
                Template="{StaticResource DesignerItemTemplateLine}">
        <Rectangle Fill="Blue" IsHitTestVisible="False" Name="mRect">
          <Rectangle.RenderTransform>
            <TransformGroup>          
                <RotateTransform Angle="45"/>
            </TransformGroup>
          </Rectangle.RenderTransform>          
        </Rectangle>
    </ContentControl>

C # код

 private void MoveThumb_DragDelta(object sender, DragDeltaEventArgs e)
    {
        Control designerItem = this.DataContext as Control;

        if (designerItem != null)
        {
            double left = Canvas.GetLeft(designerItem);
            double top = Canvas.GetTop(designerItem);

            if (mRect != null)// This line don't compile
            Canvas.SetLeft(designerItem, left + e.HorizontalChange);
            Canvas.SetTop(designerItem, top + e.HorizontalChange);
            //Canvas.SetTop(designerItem, top + e.VerticalChange);
        }
    }

Вы можете заметить, что "if (mRect! = Null)" не проходит компиляцию

------------- Seconde Edit --- Весь код -------------------------- -

<Window x:Class="DiagramDesigner.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:s="clr-namespace:DiagramDesigner"
    WindowStartupLocation="CenterScreen"
    Title="Move"
    Height="550" Width="750">

<!-- MoveThumb Template -->
<ControlTemplate x:Key="MoveThumbTemplate" TargetType="{x:Type s:MoveThumbUpDwon}">
  <Rectangle Fill="Transparent"/>
</ControlTemplate>

<!-- MoveThumb Template -->
<ControlTemplate x:Key="MoveThumbTemplateLeftRight" TargetType="{x:Type s:MoveThumbLeftRight}">
      <Rectangle Fill="Transparent"/>
</ControlTemplate>
 <!-- MoveThumb Template -->
 <ControlTemplate x:Key="MoveLineTemplate" TargetType="{x:Type s:MoveLine}">
        <Rectangle Fill="Black">
            <Rectangle.RenderTransform>
                <TransformGroup>

                    <RotateTransform Angle="45"/>
                </TransformGroup>
            </Rectangle.RenderTransform>
        </Rectangle>
    </ControlTemplate>

    <!-- Designer Item Template-->
<ControlTemplate x:Key="DesignerItemTemplate" TargetType="ContentControl">
  <Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}">
    <s:MoveThumbUpDwon Template="{StaticResource MoveThumbTemplate}" Cursor="SizeAll"/>

    <ContentPresenter Content="{TemplateBinding ContentControl.Content}"/>
  </Grid>
</ControlTemplate>

<ControlTemplate x:Key="DesignerItemTemplateLeftRight" TargetType="ContentControl">
    <Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}">
        <s:MoveThumbLeftRight Template="{StaticResource MoveThumbTemplateLeftRight}" Cursor="SizeAll"/>

        <ContentPresenter Content="{TemplateBinding ContentControl.Content}"/>
    </Grid>
</ControlTemplate>

<ControlTemplate x:Key="DesignerItemTemplateLine" TargetType="ContentControl">
    <Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}">
        <s:MoveLine Template="{StaticResource MoveLineTemplate}" Cursor="SizeAll"/>

        <ContentPresenter Content="{TemplateBinding ContentControl.Content}"/>
    </Grid>
</ControlTemplate>
</Window.Resources>

 <Canvas>
    <ContentControl Width="600"

                Height="5"

                Canvas.Top="250"
                Canvas.Left="80"

                Template="{StaticResource DesignerItemTemplate}">
  <Rectangle Fill="Blue"
           IsHitTestVisible="False"/>
</ContentControl>

    <ContentControl Width="5"

                Height="400"

                Canvas.Top="80"
                Canvas.Left="350"


                Template="{StaticResource DesignerItemTemplateLeftRight}">
        <Rectangle Fill="Blue"

           IsHitTestVisible="False"/>
    </ContentControl>

    <ContentControl Width="5" Height="400" Canvas.Top="80" Canvas.Left="350"               
                Template="{StaticResource DesignerItemTemplateLine}">
        <Rectangle Fill="Blue" IsHitTestVisible="False" Name="mRect">
          <Rectangle.RenderTransform>
            <TransformGroup>          
                <RotateTransform Angle="45"/>
            </TransformGroup>
          </Rectangle.RenderTransform>          
        </Rectangle>
    </ContentControl>


</Canvas>

Теперь код C #

using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Shapes;
using System.Windows.Media;
using System.Windows;

namespace DiagramDesigner
{
    public class MoveThumbUpDwon : Thumb
    {
        public MoveThumbUpDwon()
        {
            DragDelta += new DragDeltaEventHandler(this.MoveThumb_DragDelta);
        }

    private void MoveThumb_DragDelta(object sender, DragDeltaEventArgs e)
    {
        Control designerItem = this.DataContext as Control;

        if (designerItem != null)
        {
            double left = Canvas.GetLeft(designerItem);
            double top = Canvas.GetTop(designerItem);

            //Canvas.SetLeft(designerItem, left + e.HorizontalChange);
            Canvas.SetTop(designerItem, top + e.VerticalChange);
        }
    }
}

public class MoveThumbLeftRight : Thumb
{
    public MoveThumbLeftRight()
    {
        DragDelta += new DragDeltaEventHandler(this.MoveThumb_DragDelta);
    }

    private void MoveThumb_DragDelta(object sender, DragDeltaEventArgs e)
    {
        Control designerItem = this.DataContext as Control;

        if (designerItem != null)
        {
            double left = Canvas.GetLeft(designerItem);
            double top = Canvas.GetTop(designerItem);

            Canvas.SetLeft(designerItem, left + e.HorizontalChange);
            //Canvas.SetTop(designerItem, top + e.VerticalChange);
        }
    }
}

public class MoveLine : Thumb
{
    public MoveLine()
    {
        DragDelta += new DragDeltaEventHandler(this.MoveThumb_DragDelta);
    }

    private void MoveThumb_DragDelta(object sender, DragDeltaEventArgs e)
    {
        Control designerItem = this.DataContext as Control;

        if (designerItem != null)
        {
            double left = Canvas.GetLeft(designerItem);
            double top = Canvas.GetTop(designerItem);
         //   if (mRect != null)

            Canvas.SetLeft(designerItem, left + e.HorizontalChange);
            Canvas.SetTop(designerItem, top + e.HorizontalChange);
            //Canvas.SetTop(designerItem, top + e.VerticalChange);
        }
    }
}

}

Ответы [ 2 ]

0 голосов
/ 29 марта 2011

Похоже, что Canvas вашего окна содержит несколько ContentControls. Один из них представляет интерес и содержит сетку, которая, в свою очередь, содержит, во-первых, экземпляр вашего класса MoveLine, а во-вторых, ContentPresenter, содержащий Rectangle.

Итак, ваше визуальное дерево выглядит примерно так:

 Window1
   Canvas
     ...
     ContentControl
       Grid
         MoveLine
         ContentPresenter
           Rectangle (mRect)

Вы пытаетесь обработать событие в MoveLine и изменить прямоугольник ContentPresenter, mRect. Вы можете ссылаться на mRect только в контексте Window1.

Проблема в том, что для WPF класс MoveLine может появиться где угодно, и поэтому, естественно, он понятия не имеет, что mRect может означать для любого конкретного экземпляра MoveLine. Как это происходит, мы знаем, что mRect является дочерним Rectangle родственного ContentPresenter, который разделяет родительский элемент с экземпляром MoveLine.

Если вы абсолютно уверены, что MoveLine будет использоваться только здесь, вы можете использовать методы Get.Parent (), GetChildrenCount () и GetChild () System.Windows.Media.VisualTreeHelper. Вам нужно пройти «вверх» на один уровень от MoveLine, через один, а затем вниз на один. Вы также можете перейти на один уровень вверх, а затем искать потомков с именем «mName». См. Как найти элементы управления WPF по имени или типу? . Это не очень вменяемый подход.

Я бы больше соблазнил поместить код обработки на холст или, по крайней мере, в его ContentControls, поскольку на них влияют. Я бы добавил RoutedEvent с именем, скажем, ThumbMoved, в MoveLine. RoutedEvents могут "пузыриться", чтобы быть обработанными наследственными средствами управления. Затем вы можете добавить обработчик для этого события в ContentControl, содержащий ваш Rectangle, и it может затем использовать mName для настройки прямоугольника. См. Как: создать пользовательское перенаправленное событие и Как: обработать перенаправленное событие . Очень грубо:

class MoveLine : Thumb
{
    public static readonly RoutedEvent ThumbMovedEvent = 
        EventManager.RegisterRoutedEvent("ThumbMoved", 
                                         RoutingStrategy.Bubble, 
                                         typeof(DragDeltaRoutedEventHandler), 
                                         typeof(MoveLine));

    public event DragDeltaRoutedEventHandler ThumbMoved
    {
            add { AddHandler(ThumbMovedEvent, value); } 
            remove { RemoveHandler(ThumbMovedEvent, value); }
    }

    void RaiseThumbMoved(DragDeltaEventArgs e)
    {
            DragDeltaRoutedEventArgs newEventArgs = 
                new DragDeltaRoutedEventArgs(ThumbMovedEvent, e);
            RaiseEvent(newEventArgs);
    }

    private void MoveThumb_DragDelta(object sender, DragDeltaEventArgs e)
    {
        RaiseThumbMoved(e);
        ...
    }

(где DragDeltaRoutedEventArgs - это класс, производный от RoutedEventArgs, который предоставляет те же дельты, что и DragDeltaEventArgs.) А затем в XAML вашего окна:

    ...
    <ContentControl Width="5" Height="400" Canvas.Top="80" Canvas.Left="350"               
     Template="{StaticResource DesignerItemTemplateLine}"
     MoveLine.ThumbMoved="MoveLine_ThumbMoved">
        <Rectangle Fill="Blue" IsHitTestVisible="False" Name="mRect">
            ...

И код позади:

namespace DiagramDesigner
{
    public partial class Window1 : Window
    {
        private void MoveLine_ThumbMoved(object sender, DragDeltaRoutedEventArgs e)
        {
            mRect.Foo = "Bar"; // mRect is recognised by Window1.
        }
        ...
0 голосов
/ 29 марта 2011

Ссылка находится в выделенном фрагменте кода, но, по-видимому, в другом классе, чем xaml:

<Window x:Class="DiagramDesigner.Window1"> vs public class MoveLine : Thumb

Они должны быть того же классаесли вы собираетесь ссылаться на элементы, определенные в xaml, из выделенного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...