2012-05-30 18 views
0

Я пытаюсь создать собственный элемент управления с помощью C#/WPF. См. Ниже для XAML моего элемента управления и окно, в которое я пытаюсь его вставить.Вопрос о настройке или размещении пользовательского контроля

Проблема: Когда я устанавливаю свойства HorizontalAlignment или вертикального выравнивания в центр, верхний левый угол элемента управления центрирован, но продолжается вниз и вправо. Ограничительная рамка элемента управления, как показано в дизайнере, очень мала (нулевая ширина/высота, я думаю).

Кажется, что у меня есть проблема с моим контролем, не сообщая о его размере должным образом, когда макет выполняет свою задачу. Кроме того, при изменении высоты и ширины не изменяется размер. У меня нет ничего в коде (пока), который изменяет внешний вид элемента управления (например, без переопределения мер).

Это моя первая попытка пользовательского контроля - возможно, лучше это сделать (TextBlock приходит на ум), но эй, вот как я узнаю! : D

Часть XAML определения моего контроля:

<UserControl x:Class="LCD.LiquidCrystalDisplay" 
      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:DesignWidth="300" d:DesignHeight="122"> 
    <Canvas> 

     <Rectangle Fill="#FFD1D1D1" Width="300" Height="122" /> 
     <Rectangle Fill="#FF345534" Margin="12,8,12,8" Width="276" Height="106" /> 
     <Rectangle Fill="#FF293E29" Margin="15,11,15,11" Width="270" Height="100" /> 

     <Line X1="32" X2="32" Y2="111" Y1="11" StrokeThickness="1" Stroke="#FF345534" /> 
     <Line X1="50" X2="50" Y2="111" Y1="11" StrokeThickness="1" Stroke="#FF345534" /> 
     <Line X1="67" X2="67" Y2="111" Y1="11" StrokeThickness="1" Stroke="#FF345534" /> 
     <Line X1="84" X2="84" Y2="111" Y1="11" StrokeThickness="1" Stroke="#FF345534" /> 
     <Line X1="101" X2="101" Y2="111" Y1="11" StrokeThickness="1" Stroke="#FF345534" /> 
     <Line X1="117" X2="117" Y2="111" Y1="11" StrokeThickness="1" Stroke="#FF345534" /> 
     <Line X1="134" X2="134" Y2="111" Y1="11" StrokeThickness="1" Stroke="#FF345534" /> 
     <Line X1="151" X2="151" Y2="111" Y1="11" StrokeThickness="1" Stroke="#FF345534" /> 
     <Line X1="168" X2="168" Y2="111" Y1="11" StrokeThickness="1" Stroke="#FF345534" /> 
     <Line X1="184" X2="184" Y2="111" Y1="11" StrokeThickness="1" Stroke="#FF345534" /> 
     <Line X1="201" X2="201" Y2="111" Y1="11" StrokeThickness="1" Stroke="#FF345534" /> 
     <Line X1="218" X2="218" Y2="111" Y1="11" StrokeThickness="1" Stroke="#FF345534" /> 
     <Line X1="235" X2="235" Y2="111" Y1="11" StrokeThickness="1" Stroke="#FF345534" /> 
     <Line X1="251" X2="251" Y2="111" Y1="11" StrokeThickness="1" Stroke="#FF345534" /> 
     <Line X1="268" X2="268" Y2="111" Y1="11" StrokeThickness="1" Stroke="#FF345534" /> 

     <Line X1="15" X2="285" Y1="36" Y2="36" StrokeThickness="1" Stroke="#FF345534" /> 
     <Line X1="15" X2="285" Y1="61" Y2="61" StrokeThickness="1" Stroke="#FF345534" /> 
     <Line X1="15" X2="285" Y1="86" Y2="86" StrokeThickness="1" Stroke="#FF345534" /> 

    </Canvas> 
</UserControl> 

И XAML, включая его в окне:

<Window x:Class="TestJunk.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:my="clr-namespace:LCD;assembly=LCD" 
     Title="MainWindow" Height="341" Width="544"> 
    <Grid Name="MainGrid"> 
     <my:LiquidCrystalDisplay Name="lcd" HorizontalAlignment="Center" VerticalAlignment="Center" /> 
    </Grid> 
</Window> 
+0

Кроме того, когда этот элемент управления помещается в сетку, а определение строки или столбца сетки имеет значение «Высота» или «Ширина», заданное как «Авто», это как если бы высота и ширина элемента управления были равны нулю - строка/столбец «Сетка» сжимаются до нуля. – Steve

ответ

1

Это поведение Canvas. Вот что MSDN должен сказать:

Canvas является единственным элементом панели, которая не имеет никакой внутренней компоновки характеристики. Холст имеет свойства по умолчанию и ширины по умолчанию ноль, если только он не является дочерним элементом элемента, который автоматически определяет его дочерние элементы. Детальные элементы холста никогда не изменяются, они расположены только по заданным координатам. Это обеспечивает гибкость для ситуаций, в которых неотъемлемые ограничения размеров или выравнивание не нужны или не нужны. Для случаев, когда вы хотите, чтобы содержимое было автоматически изменено и выровнено, обычно лучше всего использовать элемент Grid.

Если вы хотите иметь UserControl изменить размер, обернуть его вокруг Viewbox и установить Height и Width к Canvas.

+0

А, спасибо! Принято :) – Steve

Смежные вопросы