我正在使用Silverlight 2.0 Unleashed Silverlight 4.0 Unleashed学习Silverlight,好吧,只是搞乱它:-)
作为其中的一部分,我正在尝试开发一个非常简单的内容控件:可以通过单击编辑的标签 .
我从另一个SO问题(Click-to-edit in Silverlight)中获取了灵感,但是我遇到了一些与Silverlight相关的新问题 . :)
我将首先发布代码,然后发布我的问题 .
这是我的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>
这是我的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;
}
}
}
首先,我必须实例化我的控件的方式非常笨拙和冗余 .
有2个ControlTemplates(一个标签,一个文本框)但是还有一个带有标签的Style用于初始化 . 如果我删除它(以及代码隐藏中的构造函数中的correspoding行),即使我也设置了模板,也不会呈现任何内容 . 肯定有更好的办法?
我的第二个问题是,当我将控件放在测试项目中并使用它时,控件 moves ?它将从中间的左侧开始作为标签,然后我点击它,文本框显示在页面的中心,然后输入标签重新出现在屏幕的左侧?
编辑:第三,一旦我用文本框替换标签,文本框没有焦点,我无法弄清楚如何给它?
最后,现在停止编辑的唯一方法是点击“输入” . 理想情况下,我只想在文本框外单击,但使用丢失的焦点事件(如链接中所示)似乎常常让我能够使用它?
我希望有一些Silverlight大师可以帮助我! :-)
哦,如果有人知道点击编辑控件可用我可以使用/看看,我也非常感激:)
提前致谢!
1 回答
我希望我能帮到你 . 你需要的是一个TextBox,它在开始时是不可编辑的,但如果你点击它,它将是可编辑的 .
为此,我创建了一个继承自TextBox的控件(我使用了vs模板TemplatedControl) . 我添加了两个状态(Edit和NotEdit)和一个Rectangle,它作为非编辑模式的文本层(为了防止在鼠标上方改变鼠标光标) . 我也在边界做了一些任务 . 例如 . 在非编辑状态中,边框的大小为0,因此TextBox看起来像Label .
这是xaml:
如您所见,有两个新状态,Edit和NotEdit .
因此,在后面的代码中,我将控件初始“发送”到NotEdit状态,并为GotFocus和LostFocus添加两个处理程序 .
处理程序只是在定义的状态下“发送”控件:
这是完整的src代码:
现在您可以在UserControl中使用它:
这只是一个快速实现,因此可以进行一些改进 . 但我希望,这可以帮助您解决问题 .
BR,TJ