2014-07-16 3 views
1

XAML에서 점 구조체 좌표를 바인딩하는 방법이 있습니까? 예를 들어 컨트롤 폭과 높이에 따라 포인트가있는 삼각형을 만들고 싶습니다.XAML의 다각형 점 바인딩

<Polygon> 
    <Polygon.Points> 
     <Point X="{Binding ElementName=control, Path=ActualWidth}" Y="{Binding ElementName=control, Path=ActualHeight}"/> 
    </Polygon.Points> 
</Polygon> 

오류 : 포인트 유형이 구조이기 때문에 내가 상속을 사용할 수 없습니다

A 'Binding' cannot be set on the 'X' property of type 'Point'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.

. PointCollection 속성 바인딩을 만들려고했지만 제대로 작동하지 않았습니다.

+0

삼각형이 2 점입니까? –

+0

아니요. 그러나 오류의 원인이되는 코드의 예일뿐입니다. 그러나 나는 한 점을 선언했다. – vdrake6

+0

Converters가 도움이 될 수 있지만 여전히 Polygon의 'Points'속성을 바인딩 할 수는 있지만 변경에 응답하지 않을 수 있습니다. – pushpraj

답변

0

방금 ​​문제가 해결되었습니다. 나는 솔루션 아이디어를 @pushpraj 사용하지만 폭에 ActualWidth과의 ActualHeight을 변경하고 높이도록 내 변환 클래스는 이제 다음과 같습니다

namespace CSharpWPF 
{ 
public class ElementToTrianglePointsConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     FrameworkElement element = value as FrameworkElement; 
     PointCollection points = new PointCollection(); 
     Action fillPoints =() => 
      { 
       points.Clear(); 
       points.Add(new Point(element.Width/2, 0)); 
       points.Add(new Point(element.Width, element.Height)); 
       points.Add(new Point(0, element.Height)); 
      }; 
     fillPoints(); 
     element.SizeChanged += (s, ee) => fillPoints(); 
     return points;// store; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
} 

나는 모든 자식 컨트롤이 초기화 될 때 ActualWidth와의 ActualHeight 속성이 초기화되어 있다고 생각합니다.

도움 주셔서 감사합니다.

1

u는 멀티 바인딩 및 변환기를 사용할 수 있습니다.

<Window x:Class="WpfApplication13.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local ="clr-namespace:WpfApplication13" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <local:converter x:Key="pointConverter" /> 
    </Window.Resources> 
    <Grid x:Name="control" > 
     <Polygon Fill="Black" Stroke="Black"> 
      <Polygon.Points> 
       <MultiBinding Converter="{StaticResource pointConverter}" > 
        <Binding Path="ActualWidth" ElementName="control"/> 
        <Binding Path="ActualHeight" ElementName="control"/> 
       </MultiBinding> 
      </Polygon.Points> 
     </Polygon> 
    </Grid> 
</Window> 

또는 백그라운드에서 작업을 수행 할 수 있습니다 : 그것은 수도

은 다음과 같다 내가 가진 삼각형을 해결하기 위해 시도

여기

public MainWindow() 
     { 
      InitializeComponent(); 
      MultiBinding mb = new MultiBinding(); 

      Binding bind = new Binding("ActualWidth"); 
      bind.Source = control; 

      mb.Bindings.Add(bind); 

      bind = new Binding("ActualHeight"); 
      bind.Source = control; 

      mb.Bindings.Add(bind); 
      mb.Converter = new converter(); 

      pg.SetBinding(Polygon.PointsProperty, mb); 
     } 




class converter : IMultiValueConverter 
    { 

     public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      try 
      { 
       double width = (double)values[0]; 
       double height = (double)values[1]; 

       PointCollection pc = new PointCollection(); 
       pc.Add(new Point(0, 0)); 
       pc.Add(new Point(width - 10, height - 10)); 
       return pc; 
      } 
      catch 
      { 
       return null; 
      } 
     } 

     public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
+0

PointCollection에서 멀티 바인딩을 사용할 수 없습니다. – vdrake6

+0

@ vdrake6 왜? PointCollection과 바인딩하지 않습니다. Point입니다. 의존성 속성입니다. – Rang

+0

오류 'MultiBinding'형식의 인스턴스를 'PointCollection'형식의 컬렉션에 추가 할 수 없습니다. 'Point'유형의 항목 만 허용됩니다. – vdrake6

3

당신이 갈 두 가지 접근 방식

(210)

결과

result


뷰 박스 접근

당신이 컨트롤의 크기의 삼각형을 렌더링에 관심이 있다면 다음이 위의

<Grid> 
    <Viewbox Stretch="Fill"> 
     <Path Data="M 1.5,0 L 3,3 0,3 Z" 
       Width="3" Height="3" 
       Fill="Gray" /> 
    </Viewbox> 
</Grid> 

당신의 선택이 될 수 접근 방식은 삼각형을 렌더링하고 부모 contr의 크기로 크기가 조정됩니다 ol을 통해 Viewbox에 추가하여 경로에 회전 변환을 추가하고 필요에 따라 삼각형을 회전 할 수 있습니다. 당신은 단순히 상관없이 삼각형 필요하지 않은

이 방법이 권장되는 방법 변환기

<Grid xmlns:l="clr-namespace:CSharpWPF" 
     x:Name="control"> 
    <Grid.Resources> 
     <l:ElementToTrianglePointsConverter x:Key="ElementToTrianglePointsConverter" /> 
    </Grid.Resources> 
    <Polygon Points="{Binding ElementName=control, Converter={StaticResource ElementToTrianglePointsConverter}}" 
      FillRule="Nonzero" 
      Fill="Gray" /> 
</Grid> 

접근 위

namespace CSharpWPF 
{ 
    public class ElementToTrianglePointsConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      FrameworkElement element = value as FrameworkElement; 
      PointCollection points = new PointCollection(); 
      Action fillPoints =() => 
       { 
        points.Clear(); 
        points.Add(new Point(element.ActualWidth/2, 0)); 
        points.Add(new Point(element.ActualWidth, element.ActualHeight)); 
        points.Add(new Point(0, element.ActualHeight)); 
       }; 
      fillPoints(); 
      element.SizeChanged += (s, ee) => fillPoints(); 
      return points;// store; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

작은 버그가 변환기를 사용하여


다각형, 나는 항상 창의 크기를 재조정해야한다. 삼각형을 볼 수 있기 전에. 디자인 타임에는 기본적으로 볼 수 있지만 윈도우 크기를 조정하지 않으면 런타임에는 볼 수 없습니다. polygon에는 점이 있지만 렌더링되지는 않았지만, 왜 그런지는 모르겠다. 문제를 조사해야합니다

+0

어떻게 수정해야 할 지 모르겠습니다. – vdrake6

+0

나는 그것도 가지고 있지 않다. BTW Viewbox 접근 방식에 대해 어떻게 생각하십니까? 그게 니 니 필요에 맞는거야? – pushpraj