2016-10-14 8 views
0

ユーザーコントロールのサイズを垂直方向に変更できるようにする必要があります。そこで検索を行うと、Thumbクラスとテンプレートの使用方法に関するいくつかの例がわかりました。だから私は、テンプレートの設定:WPF:テンプレートで発生したイベントからコントロールのプロパティ値を取得する方法

<UserControl.Resources> 

    <!-- ResizeDecorator Template --> 
    <ControlTemplate x:Key="ResizeDecoratorTemplate" TargetType="{x:Type Control}"> 
     <Grid> 
      <t:ResizeThumb Height="3" Cursor="ScrollNS" VerticalAlignment="Bottom" Margin="0 0 0 -4" ItemResizeCompleted="ResizeThumb_ItemResizeCompleted" /> 
     </Grid> 
    </ControlTemplate> 

    <!-- Designer Item Template--> 
    <ControlTemplate x:Key="DesignerItemTemplate" TargetType="ContentControl"> 
     <Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}"> 
      <Control Template="{StaticResource ResizeDecoratorTemplate}" /> 
      <ContentPresenter Content="{TemplateBinding ContentControl.Content}" /> 
     </Grid> 
    </ControlTemplate> 

</UserControl.Resources> 

をそれから私のセットアップResizeThumbクラス:

Dim si As New SchedItem(id, StartTime, Duration, SO, Title, UnitOfWork, BackgroundColor, Status, LastNote, Miles, Hours) 
    Dim cc As ContentControl = New ContentControl 
    cc.Content = si 
    cc.Template = FindResource("DesignerItemTemplate") 

各SchedItem:

Public Class ResizeThumb 
Inherits Thumb 

Public Event ItemResizeCompleted(sender As Object, e As TimeSlotPanelItemResizeEventArgs) 
Public Property id As Integer 

Public Sub New() 
    AddHandler DragDelta, AddressOf ResizeThumb_DragDelta 
End Sub 

Private Sub ResizeThumb_DragDelta(sender As Object, e As DragDeltaEventArgs) 
    e.Handled = True 
End Sub 

Private Sub ItemResized(sender As Object, e As DragCompletedEventArgs) Handles Me.DragCompleted 
    Dim rs As ResizeThumb = CType(sender, ResizeThumb) 
    Dim gd As Grid = CType(rs.Parent, Grid) 

    Dim ee As New TimeSlotPanelItemResizeEventArgs 
    ee.id = id 
    ee.ResizeValue = e.VerticalChange 
    RaiseEvent ItemResizeCompleted(Me, ee) 
End Sub 
End Class 

私のユーザーコントロールは、私は、実行時にテンプレートを追加するように動的に追加されますidを持っています。 ResizeThumbクラスにはDragCompleteイベントがあるので、私はVerticalChangeを返すイベントを発生させており、サイズ変更されたSchedItemのIDも渡したいと思います。私はTemplatedParentにバインドしようとしましたが、許可されていません。 ResizeThumbが持つ唯一の親はグリッドです。私はTemplatedParentにグリッドのタグをバインドしようとしましたが、タグには何も見つかりませんでした。

だから私は尋ねなければなりません。 ResizeThumbクラスのItemResizedイベントハンドラからSchedItemのidプロパティにアクセスする方法はありますか?もしそうなら、どうですか?そうでない場合は、代替案?

答えて

0

聖なる牛!私はそれを考え出した。今日はほとんどの時間を取ったが、最終的にはうまくいく。使用する正しいバインディングを把握するだけでした。私のコードでは、ContentControlのTagをidに設定しました。

Dim cc As ContentControl = New ContentControl 
    cc.Tag = id '<-- right here 
    cc.Content = si 
    cc.Template = FindResource("DesignerItemTemplate") 

次に、XAMLで、ResizeThumbクラスのTagプロパティを含むGridにそのタグをバインドする方法を考え出しました。

<!-- ResizeDecorator Template --> 
    <ControlTemplate x:Key="ResizeDecoratorTemplate" TargetType="{x:Type Control}"> 
     <Grid Tag="{Binding RelativeSource={RelativeSource AncestorType=ContentControl}, Path=Tag}"> 
      <t:ResizeThumb Height="3" Cursor="ScrollNS" VerticalAlignment="Bottom" Margin="0 0 0 -4" ItemResizeCompleted="ResizeThumb_ItemResizeCompleted" /> 
     </Grid> 
    </ControlTemplate> 

そして今ItemResizedイベントで、私は、送信者の親であるグリッドに取得することができ、およびイベントのIDにタグを割り当てます。

Private Sub ItemResized(sender As Object, e As DragCompletedEventArgs) Handles Me.DragCompleted 
    Dim rs As ResizeThumb = CType(sender, ResizeThumb) 
    Dim gd As Grid = CType(rs.Parent, Grid) 

    Dim ee As New TimeSlotPanelItemResizeEventArgs 
    ee.id = gd.Tag 
    ee.ResizeValue = e.VerticalChange 
    RaiseEvent ItemResizeCompleted(Me, ee) 
End Sub 

これで、イベントでIDが返されました。

関連する問題