如何隐藏WPF控件的一部分

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)


Ric*_*key 5

您可以在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.InteractivityMicrosoft.Expression.Interactions到项目中.