0

私の WPF アプリケーションは、タイムラインを UserControl として表示するため、スクロールビューアを使用します。

UserControl の幅は特定の値に依存するため、0 ピクセル幅から N 幅になる可能性があります。

私が抱えている問題は、WPFにこれがどれだけ広いかを知らせることです。

<UserControl x:Class="TimeLineCanvas.UserControls.TimeLine"
         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:helper="clr-namespace:TimeLineCanvas.Helpers"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300"
         DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1,AncestorType=Window}}">
<Grid>

    <Grid.Resources>
        <ResourceDictionary Source="../ResourceDictionary.xaml" />
    </Grid.Resources>

    <Grid.RowDefinitions>
        <RowDefinition Height="300" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="450"></ColumnDefinition>
        <ColumnDefinition Width="200"></ColumnDefinition>
    </Grid.ColumnDefinitions>

    <ScrollViewer HorizontalScrollBarVisibility="Auto" Grid.Row="0" Grid.Column="0" Margin="10">
        <Grid>
            <!--<Grid HorizontalAlignment="Left" Width="500">-->

            <Grid.RowDefinitions>
                <RowDefinition Height="40" />
                <RowDefinition Height="110" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <Canvas x:Name="MyCanvasMarkers" Grid.Row="0"  VerticalAlignment="Top" Grid.Column="0" /> <!-- this will always be the widest of the canvas's-->

            <Canvas x:Name="MyCanvasShowEvents" Grid.Row="1" Grid.Column="0" />

            <Canvas x:Name="MyCanvasFailEvents" Grid.Row="1" Grid.Column="0" />
        </Grid>
    </ScrollViewer>

    <!-- I doubt anything below this is useful for this post but I keep it in case I'm wrong-->

    <Grid x:Name="ConfigurationGrid" Grid.Column="1" Grid.Row="0" >

        <StackPanel>
            <Expander IsExpanded="True">
                <Expander.Header>
                    <TextBlock Text="Zoom" />
                </Expander.Header>
                <Expander.Content>
                    <Border Style="{StaticResource LightBorder}">
                        <StackPanel>

                            <TextBlock Text="Select Zoom Out Level" />
                            <ComboBox ItemsSource="{Binding ScaleFactorOptions}" 
              SelectedItem="{Binding SelectedScaleFactor, UpdateSourceTrigger=PropertyChanged}"                   
              HorizontalAlignment="Left" 
              SelectionChanged="ZoomLevel_SelectionChanged"
              >
                                <ComboBox.Resources>
                                    <helper:ZoomConverter x:Key="ZoomConverter" />
                                </ComboBox.Resources>
                                <ComboBox.ItemTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding Converter={StaticResource ZoomConverter}}" />
                                    </DataTemplate>
                                </ComboBox.ItemTemplate>
                            </ComboBox>
                        </StackPanel>
                    </Border>
                </Expander.Content>
            </Expander>

            <Expander IsExpanded="True" >
                <Expander.Header>
                    <TextBlock Text="Time Period" />
                </Expander.Header>
                <Expander.Content>
                    <Border Style="{StaticResource LightBorder}">
                        <StackPanel>
                            <TextBlock Text="Change Time Period" />
                            <ComboBox ItemsSource="{Binding PeriodOptions}" 
              SelectedItem="{Binding SelectedPeriod, UpdateSourceTrigger=PropertyChanged}"                   
              HorizontalAlignment="Left" 
              SelectionChanged="TimePeriod_SelectionChanged"
              >
                            </ComboBox>
                        </StackPanel>
                    </Border>
                </Expander.Content>
            </Expander>

            <Expander IsExpanded="True">
                <Expander.Header>
                    <TextBlock Text="Properties" />
                </Expander.Header>
                <Expander.Content>
                    <Border Style="{StaticResource LightBorder}">
                        <StackPanel>
                            <TextBlock x:Name="txtProperty"/>
                        </StackPanel>
                    </Border>
                </Expander.Content>
            </Expander>
        </StackPanel>
    </Grid>
</Grid>

上記のコードでわかるように、幅を 500 に設定した行をコメントアウトしました。これを行うと、スクロールバーが表示され、その値に合わせてスクロールできます。私のキャンバス。

ColumnDefintion = Autoまた、これが役立つかどうかを確認するために を追加しようとしましたが、そうではありませんでした。

Canvas の幅をコード ビハインドで調べてから手動で幅を設定する必要がありますか、それとも XAMLでプロパティStretch内(または同様のもの) を使用して自動的にこれを行うことができますか?HoriztonalAlignment

4

3 に答える 3

0

現時点では、コンテンツに合わせてすべてのコントロールが自動サイズ調整されており、ScrollViewer. 代わりに、 を削除してto にGrid設定HorizontalAlignmentします(または手動でサイズを割り当てます)。ScrollViewerStretch

于 2013-11-06T15:04:21.627 に答える