2017-02-09 1 views
0

Nachdem ich einige Stunden damit verbracht habe, eine Bildlaufleiste in WPF zu entwerfen, habe ich ein Problem. Die gesamte Bildlaufleiste ist in einem Ressourcenwörterbuch definiert. Ich erstelle eine vertikale Bildlaufleiste, der Code XAML ist hierElement in WPF-Bildlaufleiste finden

<!-- Vertical ScrollBar with grip control definition --> 
    <ControlTemplate x:Key="VerticalScrollBarWithGrip" TargetType="{x:Type ScrollBar}"> 
    <Grid> 
     <Grid.RowDefinitions> 
     <RowDefinition MaxHeight="18"/> 
     <RowDefinition MaxHeight="18"/> 
     <RowDefinition Height="0.00001*"/> 
     <RowDefinition MaxHeight="18"/> 
     </Grid.RowDefinitions> 

     <!-- GripControl --> 
     <Border BorderThickness="1" CornerRadius="1" Name="PART_SplittGripCtrl"> 
     <Border.Style> 
      <Style> 
      <Setter Property="Border.Background" Value="{StaticResource ScrollBarLightColor}"/> 
      <Setter Property="Border.BorderBrush" Value="#C9C9C9"/> 
      <Style.Triggers> 
       <Trigger Property="Border.IsMouseOver" Value="True"> 
       <Setter Property="Border.BorderBrush" Value="{StaticResource BorderHighlight}"/> 
       <Setter Property="Border.Background" Value="{StaticResource BorderHighlight}"/> 
       <Setter Property="Border.Cursor" Value="SizeNS"/> 
       </Trigger> 
      </Style.Triggers> 
      </Style> 
     </Border.Style> 
     <Image Source="Res/grip.png" Height="17" Width="17" RenderOptions.BitmapScalingMode="NearestNeighbor"/> 
     </Border> 

     <Border Grid.Row="1" Grid.RowSpan="3" Background="{StaticResource ScrollBarLightColor}"/> 
     <RepeatButton Grid.Row="1" Style="{StaticResource ScrollBarLineButton}" Height="18" Command="ScrollBar.LineUpCommand" Content="M 0 5 L 10 5 L 5 0 Z"/> 
     <Track x:Name="PART_Track" Grid.Row="2" IsDirectionReversed="true"> 
     <Track.DecreaseRepeatButton> 
      <RepeatButton Style="{StaticResource ScrollBarPageButton}" Command="ScrollBar.PageUpCommand"/> 
     </Track.DecreaseRepeatButton> 
     <Track.Thumb> 
      <Thumb Style="{StaticResource ScrollBarThumb}" Margin="5,2"> 
      <Thumb.Background> 
       <SolidColorBrush Color="{StaticResource DefaultScrollBarColor}"/> 
      </Thumb.Background> 
      </Thumb> 
     </Track.Thumb> 
     <Track.IncreaseRepeatButton> 
      <RepeatButton Style="{StaticResource ScrollBarPageButton}" Command="ScrollBar.PageDownCommand"/> 
     </Track.IncreaseRepeatButton> 
     </Track> 
     <RepeatButton Grid.Row="4" Style="{StaticResource ScrollBarLineButton}" Height="18" Command="ScrollBar.LineDownCommand" Content="M 0 0 L 5 5 L 10 0 Z"/> 
    </Grid> 
    </ControlTemplate> 

Sie sehen können, habe ich ein Element namens „PART_SplittGripCtrl“. Das Bild unten zeigt dir, wie meine Scrollleiste aussieht.

Grip in Scrollbar

Ja, sollte meine Scrollbar ein ähnliches Verhalten zu dem von Visual Studio hat.

Jetzt möchte ich die „PART_SplittGripCtrl“ in C# -Code zu finden, aber ich dieses Element nicht finden. Ich habe also ein paar Fragen.

  1. Wie finde ich PART_SplittGripCtrl in einer Bildlaufleiste Ressource?
  2. Wie kann ich Ereignisse zu einem WPF-Element hinzufügen, das in einem Resource Dictionary erstellt wird?
  3. Im Moment habe ich vergessen, was ich ich bin sehr dankbar,

Für einige Tipps fragen wollte.

***** ***** bearbeiten

ich jetzt einige Teile umbenennen. Meine Custom Sieht aus wie dieses

[TemplatePart(Name = "PART_SplittGripCtrl", Type =typeof(Border))] 
    public class VsScrollbar : ScrollBar 
    { 
    static VsScrollbar() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(VsScrollbar), new FrameworkPropertyMetadata(typeof(VsScrollbar))); 
    } 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
    } 
    } 

Die generic.xaml hier ist

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Org.Vs.ScrollbarTest.CustomControls"> 


    <Style TargetType="{x:Type local:VsScrollbar}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate TargetType="{x:Type local:VsScrollbar}"> 
      <Border Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}"> 
      </Border> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 
</ResourceDictionary> 

Antwort

1

Neben es ein Tippfehler in der Vorlage (SplittGripCtrl vs SplitterGripCtrl) ist dies zu tun in OnApplyTemplate

arbeiten sollte
public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 

     var border= this.GetTemplateChild("SplittGripCtrl") as Border; 
     if (border!= null) 
     { 
      border.Background = new SolidColorBrush(Colors.Red); 
      border.MouseUp += (sender, args) => MessageBox.Show("hi"); 
     } 
    } 

Sie sollten auch ein Gewölbe davon machen, wesentliche Teile Ihrer Vorlagen so zu deklarieren. nur um Template-Overrides zu erlauben.

[TemplatePart(Name = "SplitterGripControl", Type = typeof(Border))] 

Sie müssen nur ein neues benutzerdefiniertes Element erstellen. Ändern Sie es so, dass es von der Bildlaufleiste übernommen wird. Die Steuerung wird dann aus Ihrem eigenen Code Klasse und deklarative innerhalb Themen enthalten Syntax/generic.xaml Create new element example

+0

Vielen Dank, aber im Moment habe ich hinzufügen meine Ressource Wörterbuch wie diese ' '. Ich lese mit Ihrer Methode ich muss eine eigene Kontrollklasse erstellen. Ich weiß nicht, wie ich eine solche Klasse für eine Bildlaufleiste erstelle. – simmeone

+0

@simeone hat einen Screenshot hinzugefügt. – Dbl

+0

Vielen Dank für Ihren Hinweis. Ich erstelle ein CustomControl, das von ScrollBar erbt. In meiner ScrollbarResources.xaml habe ich einen Verweis auf mein CustomControl wie folgt hinzugefügt: ein. Aber jetzt bekomme ich eine Ausnahme von .NET: Eine erste Chance Ausnahme vom Typ 'System.ArgumentException' aufgetreten in PresentationFramework.dll Zusätzliche Informationen: "TargetType 'MyScrollbar'" für "ControlTemplate" stimmt nicht mit dem als Vorlage verwendeten "ScrollBar" überein. WTF? – simmeone