2010-11-26 14 views
0

Als Teil des Erlernens von Silverlight versuche ich ein Basis-Benutzersteuerelement zu erstellen, das als Ausgangspunkt für meine geerbten Steuerelemente verwendet werden soll. Es ist sehr einfach, definiert sie lediglich einige Callback-Methoden:Aufrufen einer Basisklassenmethode aus Silverlight XAML

public class ClickableUserControl : UserControl 
{ 
    private Control _superParent; 

    public ClickableUserControl() 
    { 

    } 

    public ClickableUserControl(Control superParent) 
    { 
     _superParent = superParent; 

     this.MouseEnter += new MouseEventHandler(PostfixedLayoutItem_MouseEnter); 
     this.MouseLeave += new MouseEventHandler(PostfixedLayoutItem_MouseLeave); 
     this.MouseLeftButtonDown += new MouseButtonEventHandler(PostfixedLayoutItem_MouseLeftButtonDown); 
    } 

    public virtual void PostfixedLayoutItem_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     var elements = VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null), this); 
     if (elements.Any(elm => elm is ClickToEditTextBox)) 
     { 
      e.Handled = false; 
     } 
    } 

    public void PostfixedLayoutItem_MouseLeave(object sender, MouseEventArgs e) 
    { 
     this.Cursor = Cursors.Arrow; 
    } 

    public void PostfixedLayoutItem_MouseEnter(object sender, MouseEventArgs e) 
    { 
     this.Cursor = Cursors.Hand; 
    } 

    public void ClickToEditTextBox_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Enter || e.Key == Key.Escape) 
     { 
      VisualStateManager.GoToState((Control)sender, "NotEdit", false); 
      _superParent.Focus(); 
     } 
    } 

} 

Bitte beachten Sie die ClickToEditTextBox_KeyDown() -Methode, die das Problem ist!

Nun, ich habe eine Kontrolle geerbt, die wie folgt aussieht (CheckboxLayoutItem.xaml):

<local:ClickableUserControl x:Class="OpusFormBuilder.LayoutItems.CheckboxLayoutItem" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:OpusFormBuilder.LayoutItems" 
mc:Ignorable="d" 
d:DesignHeight="300" d:DesignWidth="400" x:Name="LayoutItem"> 
<StackPanel Name="stackPanel1" Orientation="Horizontal"> 
    <lc:LayoutItem Label="layoutItem" Name="layoutItem"> 
       <lc:LayoutItem.LabelTemplate> 
        <DataTemplate> 
         <Self:ClickToEditTextBox KeyDown="ClickToEditTextBox_KeyDown" Text="{Binding Label, Mode=TwoWay, ElementName=layoutItem}" MaxWidth="150" MinWidth="150" TextWrapping="Wrap" MaxHeight="200" VerticalAlignment="Top" /> 
        </DataTemplate> 
       </lc:LayoutItem.LabelTemplate> 
       <dxe:CheckEdit Name="InnerCheckbox" Grid.ColumnSpan="2" Grid.Column="0" Grid.Row="0" VerticalAlignment="Top" HorizontalAlignment="Stretch" IsEnabled="False" /> 
      </lc:LayoutItem> 
    <Self:ClickToEditTextBox KeyDown="ClickToEditTextBox_KeyDown" x:Name="Description" MaxWidth="150" MaxHeight="200" TextWrapping="Wrap" VerticalAlignment="Top" HorizontalAlignment="Right" /> 
</StackPanel> 

(Hinweis - ich habe einige Namespace-Deklarationen für das Lesen zu vereinfachen entfernt) Beachten Sie die folgende Zeile :

<Self:ClickToEditTextBox KeyDown="ClickToEditTextBox_KeyDown" Text="{Binding Label, Mode=TwoWay, ElementName=layoutItem}" MaxWidth="150" MinWidth="150" TextWrapping="Wrap" MaxHeight="200" VerticalAlignment="Top" /> 

, in dem ich das KeyDown-Ereignis auf einer ClickToEditTextBox gesetzt (der Selbstnamensraum definiert ist, und richtig so).

Nun, in dem Code hinter (CheckboxLayoutItem.xaml.cs) im Konstruktor schlägt der Aufruf von InitializeComponent() mit dem Fehler fehl: Fehler beim Zuweisen der Eigenschaft 'System.Windows.UIElement.KeyDown'. [Zeile: 17 Position: 42]

Ich kann zwar nicht in InitializeComponent debuggen, aber ich kann nicht sehen, was möglicherweise von diesem Fehler abgesehen von den KeyDown-Ereignissen im XAML sein könnte.

Nun, hier ist meine Frage - wie kommt es, dass ich (scheinbar) nicht auf eine in meiner Basisklasse definierte Methode verweisen kann !? Zuvor hatte ich die Methode in der CheckboxLayoutItem.xaml.cs-Methode selbst, aber da einige andere Steuerelemente einige der gleichen Funktionalität benötigten, erschien es besser, sie in eine Basisklasse zu legen.

Prost!

+0

Ich weiß, dass dies ein bisschen albern scheinen mag, aber ich bin gespannt, was passiert, wenn Sie im Code hinter Ihrem Kind-Steuerelement auch eine Methode 'ParentClickToEditTextBox_KeyDown (Objekt Absender, KeyEventArgs e) {base.ClickToEditKeyDown (e); } ' –

Antwort

1

Ich weiß, dass dies Ihre Frage nicht wirklich beantwortet, aber Sie könnten sich die Steuerelemente für Vorlagen (benutzerdefinierte Steuerelemente) ansehen. UserControl ist wirklich nicht die beste Lösung für das, was Sie hier versuchen.

UserControls eignen sich am besten für Situationen, in denen Sie ein einmaliges Steuerelement erstellen, von dem Sie nicht beabsichtigen, es zu übernehmen.

+0

Cheers Rhooligan! Ich begann zu vermuten, dass meine Vorgehensweise nicht in Ordnung war ... Ich werde die Template-Steuerelemente lesen und von dort aus weitermachen. – Fafnr

+0

@Fafnr, bevor Sie es in eine Vorlage verwandeln, beachten Sie, dass Vorlagen in SL4 einige seltsame Tabs (Tab-Taste für Fokus) Einschränkungen haben –

Verwandte Themen