2010-08-14 2 views
1

Мне было интересно, можно ли создать пользовательский элемент пользовательской формы. Мне нужно сделать управление, которое содержит текстовое поле, однако элемент управления должен иметь форму треугольника или более сложную, чем обычный прямоугольник/квадрат.Пользовательский контроль формы WPF

ответ

2

Короткий ответ: да. Длинный ответ читает на стили WPF управления:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Class="WpfApplication1.MainWindow" 
    x:Name="Window" 
    Title="MainWindow" 
    Width="640" 
    Height="480"> 

    <Window.Resources> 
     <Style x:Key="TextBoxSample" TargetType="{x:Type TextBox}"> 
      <Setter Property="FontWeight" Value="Bold"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type TextBox}"> 
         <Grid> 
          <Ellipse 
           x:Name="Border" 
           Stroke="#FF393785" 
           StrokeThickness="2" 
           > 
           <Ellipse.Fill> 
            <RadialGradientBrush GradientOrigin="0.25,0.25" RadiusY="0.75" RadiusX="0.75"> 
             <GradientStop Color="White" Offset="0.2"/> 
             <GradientStop Color="#FF2EC452" Offset="0.5"/> 
             <GradientStop Color="#FF606060" Offset="1"/> 
            </RadialGradientBrush> 
           </Ellipse.Fill> 
           </Ellipse>        
          <!-- The implementation places the Content into the ScrollViewer. It must be named PART_ContentHost for the control to function --> 
          <ScrollViewer 
           x:Name="PART_ContentHost" 
           Background="Transparent" 
           HorizontalAlignment="Center" 
           VerticalAlignment="Center" 
           /> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsEnabled" Value="False"> 
           <Setter Property="Fill" Value="#000" TargetName="Border"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

    </Window.Resources> 
    <Grid x:Name="LayoutRoot"> 
     <TextBox 
      Style="{StaticResource TextBoxSample}" 
      VerticalAlignment="Center" 
      HorizontalAlignment="Center" 
      Text="TextBox" 
      Width="180" 
      Height="180" 
      /> 
    </Grid> 
</Window> 
+0

Выглядит интересно, но почему Вы используете сетку в шаблоне? Sole elipse не работает? Еще один вопрос Вы использовали x: Тип TextBox, могу ли я использовать более общий тип, например UserControl, или, может быть, у меня есть пара значений в TargetType? – Berial

+0

Ellipse не является ContentControl и, следовательно, не может удерживать ScrollViewer (где содержимое TextBox будет размещаться с помощью элемента управления TextBox). Примечание. Сетка является одной из основных панелей макета. Это не DataGrid. Вы можете указать базовый класс для TextBox как TargetType, но он не будет работать, поскольку вы ожидаете, что PART_ConentHost специально предназначен для TextBox. Вы можете создавать стили, на которых могут основываться другие стили. Ох, и никогда не определяйте классы UserControls. Это просто очень плохой шаблон для WPF. К сожалению, он перешел от WinForms к WPF. Меня огорчает, когда мы об этом думаем. – FuleSnabel

+0

Спасибо за объяснение, но у меня все еще есть проблемы, чтобы выполнить мои цели. Мне нужно создать элемент управления custon, подобный этому или по крайней мере мне нужно вставить этот многоугольник два текстовых поля. Однако я думаю, что это невозможно. XAML запрещает мне помещать любые текстовые поля внутри многоугольника taht :(Более того, мне нужен этот многоугольник для заполнения всего пространства (многоугольник будет помещен в Grid, я полагаю). Можно ли это сделать так? – Berial