Eine benutzerdefinierte Textbox - WPF und Xaml
Möchte ich ein custom TextBox
mit XAML und benutzerdefinierte Klasse mit einer zusätzlichen Eigenschaft TextBox genannt PosType
. PosType
dargestellt wird, in das rote Dreieck in die Seite.
Den TextBox
sollte ein normales Textfeld mit genug Marge übrig, um nicht abfangen, der andere text.
Hier ist das Bild von dem gewünschten Aussehen der textbox.
Die Control-Klasse :
public class PosTextBox : TextBox
{
public string PosType { get; set; }
}
**Der Stil, den ich schrieb : (ganz ähnlichen Ansatz, was ich will, außer ich hier verwendeten Rahmen und andere Teile können nicht korrekt sein. **
xmlns:Pro="clr-namespace:Prox.XamlControls">
<!-- Custom TextBox -->
<Style x:Key="c1PosTextBox" TargetType="{x:Type Pro:PosTextBox}" >
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="Foreground" Value="White" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Pro:PosTextBox}">
<Grid>
<Border>
<Border>
<TextBlock Text ="{TemplateBinding Path= Pro:PosType}"></TextBlock>
<!--<TextBlock Text ="{TemplateBinding ElementName=Pro:PosTextBox, Path= Pro:PosType}"></TextBlock>-->
</Border>
</Border>
<Border Margin="5,10,5,10">
<ContentPresenter Name="Content" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" TextBlock.Foreground="White"></ContentPresenter>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
So erstellen Sie diese benutzerdefinierten Textfeld das gewünschte Aussehen erreicht ist?
Edit:
Bitte führe mich zu beheben kleinere Probleme, basierend auf dem gleichen Ansatz, den ich oben erwähnt.
- Ich denke, Funktionsindikatoren ist das, was du suchst
- Ich bin mir ziemlich sicher, dass es getan werden kann, in beide Richtungen, ich höre gerne Antworten auf die beiden Ansätze, wenn jemand gerne teilen. Dank denen dieses
- Die Umsetzung dieser mit funktionsindikatoren und die angeschlossenen Verhaltensweisen kann Ihnen mehr Flexibilität als die Verwendung von benutzerdefinierten Typ (wie
PosTextBox
) für jede UI-feature. - Nach dem spielen ein bisschen mit den vorgeschlagenen Ansätze, ich blieb mit den meinigen in diesem Fall, Basierend auf dem, was ich brauche, ich will genau den gleichen Ansatz wie ich in meiner Frage, Wenn jemand weiß, wie ich das beheben kann ich den code zur Verfügung gestellt, das zu tun job bitte helfen Sie mir auf diese Weise.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man tun, dass die Verwendung Funktionsindikatoren
Funktionsindikatoren sind gerendert, in einer anderen Ebene namens
AdornerLayer
auf der Oberseite desUIElement
, Die Sie erhalten können, die den gewünschten Effekt.Angenommen, Sie möchten den text der
PosType
gebunden werden, Sie sollten es machen wie einDependency property
.Verwenden
OnApplyTemplate
zu befestigen, die adorner zu Ihrem text boxFür weitere Informationen, können Sie überprüfen Sie heraus diese links:
http://www.codeproject.com/Articles/54472/Defining-WPF-Adorners-in-XAML
http://www.nbdtech.com/Blog/archive/2010/06/21/wpf-adorners-part-1-ndash-what-are-adorners.aspx
http://www.nbdtech.com/Blog/archive/2010/06/28/wpf-adorners-part-2-ndash-placing-any-control-on-the.aspx
Glück
PosText
stellt die "XYZ" - string. als ich deine Frage verstanden, Sie wollte, dass es sein kann, nicht wahr? Über die Anpassung anPrism
nicht ganz sicher, was du meinst .. das ist ein customUIElement
. Sie können es in einer beliebigen Ansicht, die Sie möchten, und binden diePosType
oder andere Eigenschaften, die Sie entscheiden, zu implementieren, um IhreViewModel
einfach, als würden Sie auf ein anderes Steuerelement. Es sollte keine Auswirkungen auf Ihre MVVM-design überhaupt. das gleiche gilt für IhreAdorner
DrawingContext
parameter in derOnRender
Methode hat eine Menge vonDrawXXX
Methode, die Sie verwenden können. Vielleicht finden Sie die meisten für Sie nützlich Fall istDrawText
undDrawLine
die einePoint
als parameter zum definieren, zeichnen Punkte. Sie können diese hart kodiert oder in bindbare wie diePosText
Beispiel. Hoffe, das hilft 🙂Adorner
nimmt dieTextBox
als parameter im Konstruktor, und Sie können darauf zugreifen, indemthis.AdornedElement
und zeichnen Sie Ihre Dreieck entsprechend, um es Höhe/Breite/jede andere Eigenschaft. Schauen Sie, ich bin damit einverstanden, dass, schmutzig, mit allenDrawing
shindig kann ziemlich fies, aber es hat ganz gut geklappt für uns, und erwiesen sich als wirklich gute Lösung. es ist wahre macht revieled es sich von selbst, wenn wir schrieben unsere xaml-Code, um eine neue look-and-feel und nicht haben, um diesen Teil neu schreiben, da wir es umgesetzt mit funktionsindikatoren. Nur etwas zu denken 😛