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

#wpf

#wpf

Вопрос:

 <Page.Resources>
    <ControlTemplate x:Key="Use Thumb" TargetType="Button">
        <Button>
            <Thumb DragDelta="onDragDelta">
            </Thumb>
        </Button>
    </ControlTemplate>
</Page.Resources>
  

Я попытался изменить размер кнопки и нашел решение с помощью этого кода.

 <Button x:Name="btnLoadFromFile" Content="File Load" Canvas.Left="44" Canvas.Top="16" 
    Template="{StaticResource Use Thumb}" Height="20" Width="92"/>
  

Но другая проблема, связанная с этим, заключается в том, что содержимое кнопки не отображается. Я вставляю содержимое свойства типа content = «некоторый контент» в кнопку. но появляется ошибка с какой-то проблемой дублирования содержимого.

Комментарии:

1. ControlTemplate Предполагается, что оно включает <ContentPresenter /> элемент. В чем ваш вопрос?

2. Что я хочу знать, так это как отобразить содержимое кнопки

Ответ №1:

В новом окне wpf добавьте кнопку.

В конструкторе щелкните его правой кнопкой мыши и выберите Редактировать шаблон> Редактировать шаблон из списка параметров.

Вы должны добавить что-то подобное к вашим оконным ресурсам:

     <Style x:Key="FocusVisual">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate>
                    <Rectangle Margin="2" StrokeDashArray="1 2" SnapsToDevicePixels="true" StrokeThickness="1" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD"/>
    <SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070"/>
    <SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD"/>
    <SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/>
    <SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6"/>
    <SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B"/>
    <SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/>
    <SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/>
    <SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/>
    <Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
        <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
        <Setter Property="Background" Value="{StaticResource Button.Static.Background}"/>
        <Setter Property="BorderBrush" Value="{StaticResource Button.Static.Border}"/>
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Padding" Value="1"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Border x:Name="border" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" SnapsToDevicePixels="true">
                        <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsDefaulted" Value="true">
                            <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/>
                            <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
                        </Trigger>
                        <Trigger Property="IsPressed" Value="true">
                            <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/>
                            <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/>
                            <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/>
                            <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
  

Начните с этого.

Будьте очень уверены, что не удаляете часть:

                         <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
  

Поскольку ваш контент будет отображаться в content presenter.

Повторное создание шаблонов элементов управления wpf — сложная штука. Вы должны начать с копии, которую вы получаете вот так, и выполнить серию небольших итераций для достижения того, чего вы пытаетесь достичь. Небольшое изменение… попробуйте это … небольшое изменение …. попробуйте. Затем, когда вы что-то делаете и содержимое исчезает, вы знаете, что только что нарушили его, и у вас гораздо больше шансов выяснить, что вы сделали неправильно.

Что касается изменения размера кнопки.

Это сложная задача, если вы хотите сделать функциональность внутренней для кнопки.

Возможно, стоит рассмотреть возможность размещения обычной кнопки в столбце и строке с разделителями сетки вокруг нее.

Если вы помещаете что-то в кнопку, то кнопка предназначена для нажатия. Вы нажимаете на него, и вызывается его команда. Следует учитывать, что происходит, когда вы нажимаете большой палец, который находится внутри кнопки? И как он извлекает кнопку, когда она там, чтобы вы могли перемещать ее?

Visual Studio имеет функцию изменения размера в конструкторе. Это обрабатывается путем помещения элементов управления в слой adorner.

Если вы установите высоту и ширину для той кнопки, которую вы добавили, и посмотрите в окне конструктора. Используйте Ctrl колесо прокрутки, чтобы при необходимости увеличить изображение.

Вокруг этой кнопки несколько маленьких квадратиков:

введите описание изображения здесь

При наведении курсора на них курсор меняется. Вы можете щелкнуть и перетащить их, чтобы изменить размер с угла или сбоку.

Это еще один способ достичь вашей цели. Вам понадобятся некоторые элементы управления, чтобы перейти на слой adorner, и некоторое перетаскивание их, когда они будут видны. Вам также понадобится какой-нибудь ключевой аккорд или что-то еще, чтобы переключить элемент управления в режим изменения размера и сделать эти дескрипторы видимыми или скрыть их после завершения.

Вы могли бы поступить хуже, чем взглянуть на исходный код для этой статьи здесь:

https://www.codeproject.com/Articles/22952/WPF-Diagram-Designer-Part-1

У этого есть формы с изменяемым размером, и вы, вероятно, могли бы адаптировать подход. Или, может быть, просто посмотрите, насколько большую задачу вы берете на себя.