Wrapped WPF Control

Posted by Robert on Stack Overflow See other posts from Stack Overflow or by Robert
Published on 2010-05-12T15:39:33Z Indexed on 2010/05/12 20:44 UTC
Read the original article Hit count: 500

Filed under:
|
|

Hi,

I'm trying to create a GUI (WPF) Library where each (custom) control basically wraps an internal (third party) control. Then, I'm manually exposing each property (not all of them, but almost). In XAML the resulting control is pretty straightforward:

<my:CustomButton Content="ClickMe" />

And the code behind is quite simple as well:

public class CustomButton : Control

{
private MyThirdPartyButton _button = null;

static CustomButton()
{        
    DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomButton), new FrameworkPropertyMetadata(typeof(CustomButton)));
}

public CustomButton()
{
    _button = new MyThirdPartyButton();
    this.AddVisualChild(_button);        
}

protected override int VisualChildrenCount
{    
    get
        { return _button == null ? 0 : 1; }
}

protected override Visual GetVisualChild(int index)
{
    if (_button == null)
    {
        throw new ArgumentOutOfRangeException();
    }
    return _button;
}

#region Property: Content
public Object Content
{
    get { return GetValue(ContentProperty); }
    set { SetValue(ContentProperty, value); }
}

public static readonly DependencyProperty ContentProperty = DependencyProperty.Register(
                    "Content", typeof(Object),
                typeof(CustomButton), 
                    new FrameworkPropertyMetadata(new PropertyChangedCallback(ChangeContent))
);

private static void ChangeContent(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
    (source as CustomButton).UpdateContent(e.NewValue);
}

private void UpdateContent(Object sel)
{
    _button.Content = sel;
}
#endregion

}

The problem comes after we expose MyThirdPartyButton as a property (in case we don't expose something, we would like to give the programmer the means to use it directly). By simply creating the property, like this:

    public MyThirdPartyButton InternalControl
{
    get { return _button; }
    set
    {
        if (_button != value)
        {
            this.RemoveVisualChild(_button);
            _button = value;
            this.AddVisualChild(_button);
        }
    }
}

The resulting XAML would be this:

<my:CustomButton>
<my:CustomButton.InternalControl>
    <thirdparty:MyThirdPartyButton Content="ClickMe" />
</my:CustomButton.InternalControl>

And what I'm looking for, is something like this:

<my:CustomButton>
<my:CustomButton.InternalControl Content="ClickMe" />

But (with the code I have) its impossible to add attributes to InternalControl...

Any ideas/suggestions?

Thanks a lot,

-- Robert

© Stack Overflow or respective owner

Related posts about c#

Related posts about wpf