2016-08-09 7 views
0

У меня есть НАЗН.КНОПКА с углом DependencyProperty:DataBinding в ControlTemplate к DependencyProperty работает, но по-прежнему бросает ошибки

public static readonly DependencyProperty AngleProperty = DependencyProperty.Register(
     "Angle", 
     typeof(float), 
     typeof(TriangularButton), 
     new FrameworkPropertyMetadata(0f, FrameworkPropertyMetadataOptions.AffectsRender)); 

public float Angle 
{ 
    get { return (float)GetValue(AngleProperty); } 
    set { SetValue(AngleProperty, value); } 
} 

В ControlTemplate Я хочу связываться с углом. Я пробовал несколько способов (см. Ниже), и каждый из них работает, но я получаю сообщение об ошибке System.Windows.Data. Как я могу избавиться от него?

Что я пробовал:

<Button.Template> 
    <ControlTemplate TargetType="Button"> 
     <Path ...> 
      <Path.RenderTransform> 
       <RotateTransform Angle="{Binding Angle, RelativeSource={RelativeSource TemplatedParent}}"/> 
      </Path.RenderTransform> 
     </Path> 
    </ControlTemplate> 
</Button.Template> 

Тогда я получаю:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Angle; DataItem=null; target element is 'RotateTransform' (HashCode=55197304); target property is 'Angle' (type 'Double')

Когда я делаю это:

<Button.Template> 
    <ControlTemplate TargetType="Button"> 
     <Path ...> 
      <Path.RenderTransform> 
       <RotateTransform Angle="{Binding Angle, RelativeSource={RelativeSource AncestorType=Button}}"/> 
      </Path.RenderTransform> 
     </Path> 
    </ControlTemplate> 
</Button.Template> 

Тогда я получаю:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.Button', AncestorLevel='1''. BindingExpression:Path=Angle; DataItem=null; target element is 'RotateTransform' (HashCode=24935945); target property is 'Angle' (type 'Double')

EDIT:

Благодаря this answer я узнал причину, вероятно, потому, что кнопка не видна изначально. Если я помещаю Button где-нибудь, где он изначально видимый, ошибка исчезает. Есть ли способ избавиться от ошибки, когда я использую Button где-то, что изначально не видно?

ответ

0

Вам не нужно указать источник, если вы укажете DataContext на кнопке

EDIT:

XAML:

<Window x:Class="Test.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:Test" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <TabControl> 
     <TabItem Header="1"/> 
     <TabItem Header="2"> 
      <Grid> 
       <local:TriangularButton Angle="45" Width="100" Height="100"> 
        <Button.Template> 
         <ControlTemplate TargetType="Button"> 
          <Path Stroke="Red" RenderTransformOrigin="0.5,0.5"> 
           <Path.Data> 
            <RectangleGeometry Rect="0,0,100,100"/> 
           </Path.Data> 
           <Path.RenderTransform > 
            <RotateTransform Angle="{Binding Angle, RelativeSource={RelativeSource TemplatedParent}}"/> 
           </Path.RenderTransform> 
          </Path> 
         </ControlTemplate> 
        </Button.Template> 
       </local:TriangularButton> 
      </Grid> 
     </TabItem> 
    </TabControl> 

</Grid> 

DP

rusing System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

using System.Windows; 
using System.Windows.Controls; 

namespace Test 
{ 
    public class TriangularButton : Button 
    { 
     public static readonly DependencyProperty AngleProperty = DependencyProperty.Register(
     "Angle", 
     typeof(float), 
     typeof(TriangularButton), 
     new FrameworkPropertyMetadata(0f, FrameworkPropertyMetadataOptions.AffectsRender)); 

    public float Angle 
    { 
     get { return (float)GetValue(AngleProperty); } 
     set { SetValue(AngleProperty, value); } 
    } 
} 

} код

И он отлично работает, даже я открываю с другой вкладки.

First tab opened

Tab with button

Вы можете добавить RenderTransformOrigin на вашем Пути.

+0

DataContext - это сама кнопка. DependencyProperty находится в коде. – gartenriese

+0

@gartenriese дайте мне второй –

+0

Возможно, я нашел причину ошибки, см. Редактирование. Однако я до сих пор не знаю, как избавиться от него. – gartenriese

 Смежные вопросы

  • Нет связанных вопросов^_^