Pet*_*ter 7 wpf styles datepicker wpf-controls
是否可以隐藏WPF控件的一部分?根据MSDN,.NET 4有一个DatePicker,可以呈现4个部分.是否可以隐藏(在我的情况下)TextBox部分(可能名为PART_TextBox)?
我已经看到了完全设置DatePicker样式的例子,它涉及很多XAML,当我想要做的就是隐藏控件的一部分.
Mar*_*nov 15
好吧,我有一个解决你的情况:)
class MyDateTimePicker : DatePicker
{
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
var textBox = this.Template.FindName("PART_TextBox", this) as UIElement;
if (textBox != null)
{
textBox.Visibility = Visibility.Hidden;
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在XAML中使用行为完成所有操作,并且TemplatePartAction我写道:
<DatePicker>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<local:TemplatePartAction TemplatePartName="TextBox">
<ei:ChangePropertyAction PropertyName="Visibility" Value="Collapsed"/>
</local:TemplatePartAction>
</i:EventTrigger>
</i:Interaction.Triggers>
</DatePicker>
Run Code Online (Sandbox Code Playgroud)
这是TemplatePart功能:
public class TemplatePartHelper<T> where T : IAttachedObject
{
public IAttachedObject Parent { get; set; }
public List<T> Children { get; private set; }
public string Name { get; set; }
public Control TemplatePart { get; set; }
public TemplatePartHelper(IAttachedObject parent)
{
Parent = parent;
Children = new List<T>();
}
public void AssociateChildren()
{
if (TemplatePart != null)
return;
var control = Parent.AssociatedObject as Control;
var template = control.Template;
if (template == null)
return;
var partName = "PART_" + Name;
TemplatePart = template.FindName(partName, control) as Control;
if (TemplatePart == null)
return;
foreach (var child in Children)
child.Attach(TemplatePart);
}
}
[ContentProperty("Behaviors")]
public class TemplatePartBehavior : Behavior<Control>
{
public TemplatePartHelper<Behavior> Helper { get; private set; }
public List<Behavior> Behaviors { get { return Helper.Children; } }
public string TemplatePartName { get { return Helper.Name; } set { Helper.Name = value; } }
public TemplatePartBehavior()
{
Helper = new TemplatePartHelper<Behavior>(this);
}
protected override void OnAttached()
{
AssociatedObject.Initialized += (s, e) => Helper.AssociateChildren();
AssociatedObject.Loaded += (s, e) => Helper.AssociateChildren();
}
}
[ContentProperty("Actions")]
public class TemplatePartAction : TriggerAction<Control>
{
public TemplatePartHelper<TriggerAction> Helper { get; private set; }
public List<TriggerAction> Actions { get { return Helper.Children; } }
public string TemplatePartName { get { return Helper.Name; } set { Helper.Name = value; } }
public TemplatePartAction()
{
Helper = new TemplatePartHelper<TriggerAction>(this);
}
protected override void OnAttached()
{
AssociatedObject.Loaded += (s, e) => Helper.AssociateChildren();
}
protected override void Invoke(object parameter)
{
foreach (var action in Actions)
{
if (action.IsEnabled)
{
var methodInfo = typeof(TriggerAction).GetMethod("Invoke", BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(object) }, null);
methodInfo.Invoke(action, new object[] { parameter });
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您不熟悉行为,请安装Expression Blend 4 SDK并添加以下命名空间:
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
Run Code Online (Sandbox Code Playgroud)
并添加System.Windows.Interactivity和Microsoft.Expression.Interactions到项目中.