1

最初の点が含まれているグリッドの中心にある線を作成する必要があります (グリッドの幅/高さを手動で設定する必要はありません)。これは、更新したい非常に単純なコード サンプルです。そのため、「Grid1」の中心に「Line1」の 1 つのポイントがあります。

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SimpleLine.MainWindow"
    x:Name="Window"
    Title="MainWindow"
    Width="640" Height="480">
    <Grid x:Name="LayoutRoot">
        <Grid Name="Grid1">
            <Line Name="Line1" X2="200" Y2="100" Stroke="Black"></Line>
        </Grid>
    </Grid>
</Window>

コードビハインドで試してみると:

Line1.X1 = Grid1.Widht/2; Line1.Y1 = Grid1.Height/2;

エラー (キャッチされない例外) が表示されます - 「数値ではありません」は X1(Y1) の有効な値ではありません。

ご尽力いただきありがとうございます。

PS: 私はむしろ WPF の初心者です。

4

1 に答える 1

1

コード ビハインドでは、幅/高さを明示的に設定していない場合は、ActualWidth と ActualHeight を使用する必要があります。

Line1.X1 = Grid1.ActualWidth / 2; Line1.Y1 = Grid1.ActualHeight / 2;

XAML で実行する場合は、BindingConverters を作成して、バインドされた値に対してロジックを実行できます。

Xaml:

<Window x:Class="WpfApplication6.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication6"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:DivideByConverter x:Key="Divider" />
    </Window.Resources>
    <Grid x:Name="LayoutRoot">
        <Line Name="Line1" X2="{Binding ElementName=LayoutRoot, Path=ActualWidth, Converter={StaticResource ResourceKey=Divider}}" Y2="{Binding ElementName=LayoutRoot, Path=ActualHeight, Converter={StaticResource ResourceKey=Divider}}" Stroke="Black"/>
    </Grid>
</Window>

バインディング コンバーター:

 public class DivideByConverter : IValueConverter
    {
        /// <summary>
        /// Converts a value.
        /// </summary>
        /// <param name="value">The value produced by the binding source.</param>
        /// <param name="targetType">The type of the binding target property.</param>
        /// <param name="parameter">The xmlentry to the language value</param>
        /// <param name="culture">The culture to use in the converter.</param>
        /// <returns>
        /// A converted value. If the method returns null, the valid null value is used.
        /// </returns>
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            int divider = 2;
            if (value is double)
            {
                return (double)value / divider;
            }
            return value;
        }

        /// <summary>
        /// Converts a value.
        /// </summary>
        /// <param name="value">The value that is produced by the binding target.</param>
        /// <param name="targetType">The type to convert to.</param>
        /// <param name="parameter">The converter parameter to use.</param>
        /// <param name="culture">The culture to use in the converter.</param>
        /// <returns>
        /// A converted value. If the method returns null, the valid null value is used.
        /// </returns>
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new Exception("The method or operation is not implemented.");
        }
    }

これは Binded 値 (ActualWidth) を取得し、それを 2 で割り、ActualHeight についても同じです。したがって、fromのサイズが変更されても、線は中央に留まります

于 2012-11-26T00:22:56.230 に答える