J'apprends Silverlight en utilisant Silverlight Unleashed + Silverlight 2.0 4.0 Unleashed et, bien, juste déconner avec elle :-)Contrôle au montage, comment procéder?
Dans le cadre de cela, je suis en train de développer ce qui devrait être un contrôle de contenu très simple : Une étiquette que vous pouvez modifier en cliquant dessus.
Je me suis inspiré d'une autre question SO (Click-to-edit in Silverlight), mais j'ai quelques problèmes liés à mon expérience avec Silverlight. :)
Je vais d'abord poster le code, puis mes questions.
Ceci est mon XAML:
<ContentControl x:Class="MyTestProject.SilverlightControl1"
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:sdk="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input" xmlns:local="clr-namespace:MyTestProject" mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<ContentControl.Resources>
<ControlTemplate x:Key="EditableLabelTextboxTemplate">
<TextBox Name="UCTB" Text="{Binding Text, Mode=TwoWay}" Width="100" Height="25" ></TextBox>
</ControlTemplate>
<ControlTemplate x:Name="LabelTemplate" TargetType="local:SilverlightControl1">
<sdk:Label x:Name="UCLBL" Content="{Binding Text}" />
</ControlTemplate>
<Style TargetType="local:SilverlightControl1">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate x:Name="LabelTemplate2" TargetType="local:SilverlightControl1">
<sdk:Label x:Name="UCLBL" Content="{Binding Text}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ContentControl.Resources>
</ContentControl>
et ceci est mon CodeBehind:
public partial class SilverlightControl1 : ContentControl
{
public string Text { get; set; }
public SilverlightControl1()
{
this.DataContext = this;
Text = "Hello, World!";
this.DefaultStyleKey = typeof(SilverlightControl1);
//Template = this.Resources["LabelTemplate"] as ControlTemplate;
InitializeComponent();
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
this.MouseLeftButtonDown += HandleLabelLeftMouseDown;
this.KeyDown += HandleTextboxEnter;
}
public static void HandleTextboxEnter(object sender, KeyEventArgs args)
{
var ctrl = sender as SilverlightControl1;
if (ctrl.Template == ctrl.Resources["EditableLabelTextboxTemplate"])
{
if (args.Key == Key.Enter)
{
ctrl.Template = ctrl.Resources["LabelTemplate"] as ControlTemplate;
}
}
}
public static void HandleLabelLeftMouseDown(object sender, MouseButtonEventArgs args)
{
var editableLabel = sender as SilverlightControl1;
if (editableLabel.Template != editableLabel.Resources["EditableLabelTextboxTemplate"])
{
editableLabel.Template = editableLabel.Resources["EditableLabelTextboxTemplate"] as ControlTemplate;
}
}
}
Tout d'abord, la façon dont je dois instancier mon contrôle est très maladroit et redondant.
Il existe 2 ControlTemplates (une étiquette, une zone de texte) MAIS il y a aussi un Style avec une étiquette pour l'initialisation. Si je supprime ceci (et la ligne correspodante dans le constructeur dans le codebehind), rien ne s'affiche, même si je mets le template aussi. Il doit y avoir un meilleur moyen?
Mon deuxième problème est que lorsque je place mon contrôle dans un projet de test et l'utilise, le contrôle se déplace? Il va commencer au côté gauche au milieu comme une étiquette, puis je clique dessus, et la zone de texte apparaît centrée sur la page, et à l'entrée l'étiquette réapparaît sur le côté gauche de l'écran?
EDIT: Troisièmement, une fois que je remplace l'étiquette par la zone de texte, la zone de texte n'a pas de focus, et je n'arrive pas à comprendre comment le lui donner?
Enfin, la seule façon d'arrêter l'édition est de cliquer sur "Entrée". Idéalement, je voudrais juste cliquer en dehors de la zone de texte, mais en utilisant l'événement focus perdu (comme suggéré dans le lien) semble se déclencher trop souvent pour que je puisse l'utiliser?
J'espère que certains des gourous Silverlight sont là pour m'aider! :-)
Oh, et si quelqu'un sait d'un click-to-Edit Control disponible Je pourrais utiliser/regarder, je serais très reconnaissant aussi :)
Merci à l'avance!
Merci beaucoup! C'est mieux que ce que j'ai trouvé! La seule chose que je voudrais faire est d'arrêter de modifier si je clique à l'extérieur, sans vraiment me concentrer sur un autre contrôle. Je suppose que cela peut être fait en utilisant un gestionnaire de clic, cependant. (J'ai aussi dû ajouter un ControlTemplate pour le ValidationToolTipTemplate dans votre code, mais pas de biggie, juste FYI!) Aussi, beaucoup de remerciements pour l'explication de ce qui se passe - tout ce que XAML peut être assez dense parfois :) À la vôtre ! – Fafnr
Vous êtes les bienvenus (sry que je oublie le ValidationTooltipTemplate). Vous pouvez ajouter un gestionnaire MouseLeftButtonUp au RootVisual. (Application.Current.RootVisual.MouseLeftButtonUp + = RootVisual_MouseLeftButtonUp, ou peut-être la méthode AddHandler.Avec cela, vous pouvez obtenir des événements déjà gérés.) Là, vous pouvez vérifier, si l'événement Mouse était sur votre contrôle, ou non. Sinon, passez à l'état NotEdit. Cela devrait fonctionner, mais ce n'est pas une très bonne solution ... – TerenceJackson
Je sais que c'est de l'histoire ancienne maintenant, mais le projet Silverlight a été converti en un projet WPF, et l'un des snafus est le click-to -edit zone de texte:/Pour une raison quelconque, je ne peux pas vraiment entrer/afficher du texte en l'utilisant ... Je sais que c'est une grêle, mais avez-vous des idées pourquoi ce serait? Merci encore! – Fafnr