2012-05-31 2 views
14

Я пытаюсь выяснить, как лучше всего управлять некоторыми элементами управления, но не может понять, как правильно. У меня есть окно, которое добавляет в пользовательском элементе управления:WPF - Принять размер родителя

<Grid x:Name="LayoutRoot"> 
    <my:RateGraph Grid.Column="0" x:Name="rateGraph1" Height="88" Width="380" /> 
</Grid> 

Я тогда хочет размер суб-компонента этого контроля, определенный в XAML, чтобы заполнить либо высоту, ширину или оба. Однако я обнаружил, что если я сниму явную ширину/высоту и попытаюсь использовать что-то вроде VerticalAlignment = «Stretch», тогда я получаю элемент управления размером 0 ... Что я делаю неправильно?

<rb:RateBase x:Class="RateBar.RateGraph" 
      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" 
      xmlns:rb="clr-namespace:RateBar" 
      xmlns:sd="clr-namespace:System.Windows.Data" 
      mc:Ignorable="d"> 
    <RangeBase.Resources> 
     <rb:JScriptConverter x:Key="JScript" TrapExceptions="False"/> 
     <ControlTemplate x:Key="rateGraphTemplate" TargetType="{x:Type rb:RateBase}"> 
      <Canvas HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
       <rb:Axis Width="320" Height="88"/> 
       <Rectangle Height="88" Fill="#9690EE90" x:Name="progress"> 
        <Rectangle.Width> 
         <MultiBinding Converter="{StaticResource JScript}" ConverterParameter="values[0]/values[1]*values[2]"> 
          <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Value"/> 
          <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Maximum"/> 
          <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Width"/> 
         </MultiBinding> 
        </Rectangle.Width> 
       </Rectangle> 
       <Polygon Fill="#FF06B025" x:Name="graph" /> 
       <Label Canvas.Left="0" Width="380" HorizontalContentAlignment="Right" Foreground="Black" Content="{Binding Path=Caption, RelativeSource={RelativeSource TemplatedParent}}"> 
        <Canvas.Bottom> 
         <MultiBinding Converter="{StaticResource JScript}" ConverterParameter="(values[2]*0.8)/values[1]*values[0]"> 
          <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Rate"/> 
          <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="RateMaximum"/> 
          <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Height"/> 
         </MultiBinding> 
        </Canvas.Bottom> 
       </Label> 
       <Line X1="0" X2="380" Stroke="Black"> 
        <Canvas.Bottom> 
         <MultiBinding Converter="{StaticResource JScript}" ConverterParameter="(values[2]*0.8)/values[1]*values[0]"> 
          <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Rate"/> 
          <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="RateMaximum"/> 
          <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Height"/> 
         </MultiBinding> 
        </Canvas.Bottom> 
       </Line> 
      </Canvas> 
     </ControlTemplate> 
    </RangeBase.Resources> 
</rb:RateBase> 

ответ

21

The Width и Height свойств в первую очередь предназначены для установки предложено размеры.

Если вы используете динамические макеты с растяжением и т.д. связываются со свойствами ActualWidth и ActualHeight:

<Binding RelativeSource="{RelativeSource TemplatedParent}" Path="ActualWidth"/> 
+1

Спасибо Росс, мне действительно удалось получить что-то очень близкое, используя RelativeSource, хотя я использовал ' FindAncestor 'и' Width ', но вместо этого я приму ваше предложение. – Ian

+1

Спасибо. Мне это понравилось, и оно работает хорошо: Width = "{Binding RelativeSource = {RelativeSource Mode = FindAncestor, AncestorType = {x: Type Window}}, Path = Width}" –

12

Я пытался сделать что-то подобное, нашел, что это работает хорошо:

Width="{Binding RelativeSource={RelativeSource FindAncestor, 
    AncestorType={x:Type ListBox}},Path=ActualWidth}" 

Отъезд: social.msdn.microsoft

+0

Это действительно хорошо. +1 – BENN1TH

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