Стиль WPF перезаписывается при применении контента к UserControl - PullRequest
1 голос
/ 31 мая 2019

У меня есть UserContol для гиперссылки.Мне нужно динамически установить для содержимого кнопки значение базы данных.

Я посмотрел по этой ссылке [1]: Стиль пользовательского элемента управления пользовательской кнопки перезаписывается, когда для содержимого установлено значение , и кажется,У меня есть почти все из этого поста.Но я получаю ошибки, когда пытаюсь установить содержимое в пользовательском элементе управления.Я не программист WPF, поэтому любая помощь в небольших словах будет оценена.

КОНТРОЛЬ ПОЛЬЗОВАТЕЛЯ

`

<UserControl x:Class="DDC.Controls.LinkButton"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 

             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800"
             x:Name="UserControl">

    <UserControl.Resources>
        <Style x:Key="LinkButtonStyle"    TargetType="{x:Type Button}">
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlLightLightBrushKey}}"/>
            <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/>
            <Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}"/>
            <Setter Property="Cursor" Value="Hand" />
            <Setter Property="Padding" Value="5,0,0,0" />
            <Setter Property="ToolTip" Value="Click to Follow Link" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                                                <ContentPresenter 

                                  VerticalAlignment="Top">
                            <ContentPresenter.Resources>
                                <Style TargetType="{x:Type TextBlock}">
                                    <Setter Property="TextDecorations" Value="Underline" />
                                    <Setter Property="TextWrapping" Value="Wrap"/>
                                </Style>
                            </ContentPresenter.Resources>
                        </ContentPresenter>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>

            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="true">
                    <Setter Property="Foreground" Value="LightGray" />
                </Trigger>
            </Style.Triggers>
        </Style>

    </UserControl.Resources>

    <Grid>
        <Button Name ="btnLinkAddress" 
                Style="{DynamicResource LinkButtonStyle}" 
                Content="{Binding Path=Content, RelativeSource={RelativeSource AncestorType={x:Type LinkButton}}}"
                Width="Auto" 
                Height="Auto"  
                UseLayoutRounding="True" 
                Click="LinkButton_Click" >
        </Button>
    </Grid>
</UserControl>

C # Class

public partial class LinkButton : UserControl
    {

        public new static   DependencyProperty ContentProperty =
           DependencyProperty.Register("Content", typeof(object), typeof(LinkButton));

        public new object Content
        {
            get { return (string)GetValue(ContentProperty); }
            set { SetValue(ContentProperty, value); }
        }

        private void LinkButton_Click(object sender, RoutedEventArgs e)
        {
            Button btn = (Button)sender;
            TextBlock tb = (TextBlock)btn.Content;
            Uri uri = new System.Uri(tb.Text);
           // Uri uri = new System.Uri(btn.Content.ToString());

            Process.Start(new ProcessStartInfo(uri.AbsoluteUri));
            e.Handled = true;
        }
        public LinkButton()
        {
            InitializeComponent();
        }

ОШИБКИ

Я получаю эти ошибки при попытке установитьсодержимое пользовательского элемента управления

Content="{Binding Path=Content, RelativeSource={RelativeSource AncestorType={x:Type LinkButton}}}"`

LinkButton не поддерживается в проекте Windows Presentation Foundation (WPF).

Content="{Binding Path=Content, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"

Превышена глубина логического дерева при обходе дерева.Это может указывать на цикл в дереве.

1 Ответ

0 голосов
/ 31 мая 2019

Переименуйте свойство во что-то другое, чем Content:

public partial class LinkButton : UserControl
{
    public static DependencyProperty ButtonContentProperty =
       DependencyProperty.Register("ButtonContent", typeof(object), typeof(LinkButton));

    public object ButtonContent
    {
        get { return (string)GetValue(ButtonContentProperty); }
        set { SetValue(ButtonContentProperty, value); }
    }

    private void LinkButton_Click(object sender, RoutedEventArgs e)
    {
        ...
    }
    public LinkButton()
    {
        InitializeComponent();
    }
}

... и привязать к нему так:

<Button Name ="btnLinkAddress" 
        Style="{DynamicResource LinkButtonStyle}" 
        Content="{Binding Path=ButtonContent, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
        Width="Auto" 
        Height="Auto"  
        UseLayoutRounding="True" 
        Click="LinkButton_Click" >

Если вы хотите установить AncestorType на LinkButton, вы должны определить отображение пространства имен:

<Button xmlns:local="clr-namespace:DDC.Controls"
        Name ="btnLinkAddress" 
        Style="{DynamicResource LinkButtonStyle}" 
        Content="{Binding Path=Content, RelativeSource={RelativeSource AncestorType={x:Type local:LinkButton}}}"
        Width="Auto" 
        Height="Auto"  
        UseLayoutRounding="True" 
        Click="LinkButton_Click" >
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...