0

これはC#WPFとxamlです。メインウィンドウがあり、このウィンドウを共有する2つのグラフがあります。それらは垂直に配置されています。どちらもメインウィンドウと同じ幅です。ただし、2番目のグラフが折りたたまれたときに、最初のグラフがウィンドウ全体(ウィンドウ上部のマージンを除く)に表示され、高さを共有するようにします(それぞれ、Height =(ウィンドウの高さ)/ 2)両方が表示されている場合。

これが私がxamlで試したものですが、成功しませんでした:

<Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <d3:ChartPlotter  Grid.Row="0" Name ="timeDomainPlotter" >
                </d3:ChartPlotter>
                <d3:ChartPlotter  Grid.Row="1" Name ="freqDomainPlotter" >
                </d3:ChartPlotter>
            </Grid>

2番目のウィンドウがVisibility.Collapsedの場合、最初のウィンドウは2番目のウィンドウのスペースを引き継ぎません。これはどのようにすればよいですか?ありがとう。

更新:2つのグラフがあるポップアップウィンドウのコンバーターコード:

 public class VisibilityToHeightConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                GridLength height = new GridLength();

                var visiblity = (Visibility)value;
                switch (visiblity)
                {
                    case Visibility.Collapsed:
                        height = new GridLength(0, GridUnitType.Auto);
                        break;
                    case Visibility.Visible:
                        height = new GridLength(1, GridUnitType.Star);
                        break;
                    case Visibility.Hidden:
                        height = new GridLength(0, GridUnitType.Auto);
                        break;
                }

                return height;
            }

            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
        /// <summary>
        /// Interaction logic for SignalStatsDisplay.xaml
        /// </summary>
        public partial class SignalStatsDisplay : Window
        {

ポップアップウィンドウのxaml:

<Window x:Class="FileWatcherCaller.View.SignalStatsDisplay"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0"
   xmlns:local="clr-namespace:FileWatcherCaller.View"
    Title="Real Time Signal Display" Height="409" Width="1200">
    <Window.Resources>
        <local:VisibilityToHeightConverter x:Key="VisToHeightConv"/>
    </Window.Resources>
    <Grid> 
        <StackPanel Orientation="Vertical">
            <StackPanel Orientation="Horizontal">
                <CheckBox Height="16" HorizontalAlignment="Left" Name="pixVal" VerticalAlignment="Top" Width="120" Checked="checkBox1_Checked">Pixel Value</CheckBox>
                <CheckBox Height="16" HorizontalAlignment="Left" Name="roiMean" VerticalAlignment="Top" Width="120">ROI Mean</CheckBox>
                <CheckBox Height="16" HorizontalAlignment="Left" Name="roiStd" VerticalAlignment="Top" Width="120" Checked="roiStd_Checked">ROI Std</CheckBox>
            </StackPanel>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="{Binding ElementName=timeDomainPlotter, Path=Visibility, Converter={StaticResource VisToHeightConv}}" Name="RowOne" />
                    <RowDefinition Height="{Binding ElementName=freqDomainPlotter, Path=Visibility, Converter={StaticResource VisToHeightConv}}" Name="RowTwo" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <d3:ChartPlotter  Grid.Row="0" Name ="timeDomainPlotter" >
                </d3:ChartPlotter>
                <d3:ChartPlotter  Grid.Row="1" Name ="freqDomainPlotter" >
                </d3:ChartPlotter>
            </Grid>
        </StackPanel>
    </Grid>
</Window>

メインウィンドウで、2つのグラフの可視性がどのように初期化されるか:

public void StartWatch()
        {
            if (_fileWatcher != null)
            {
                _fileWatcher.Dispose();
                _fileWatcher = null;
            }
            if (InitWatcher())
            {
                this._fileWatcher.Start();
                this.ButtonStart.IsEnabled = false;
                this.ButtonStop.IsEnabled = true;
            }

             _signalDisplay = new SignalStatsDisplay();

            if (_signalDisplay.Visibility != Visibility.Visible)
            {
                _signalDisplay.Show();
                _signalDisplay.timeDomainPlotter.Visibility = Visibility.Visible;
                _signalDisplay.freqDomainPlotter.Visibility = Visibility.Collapsed;
            }


        }

Kevinの解決策として、ポップアップウィンドウ用のxamlがあります。

<Window x:Class="FileWatcherCaller.View.SignalStatsDisplay"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0"
    Title="Real Time Signal Display" Height="409" Width="1200">

    <Grid> 
        <StackPanel Orientation="Vertical">
            <StackPanel Orientation="Horizontal">
                <CheckBox Height="16" HorizontalAlignment="Left" Name="pixVal" VerticalAlignment="Top" Width="120" Checked="checkBox1_Checked">Pixel Value</CheckBox>
                <CheckBox Height="16" HorizontalAlignment="Left" Name="roiMean" VerticalAlignment="Top" Width="120">ROI Mean</CheckBox>
                <CheckBox Height="16" HorizontalAlignment="Left" Name="roiStd" VerticalAlignment="Top" Width="120" Checked="roiStd_Checked">ROI Std</CheckBox>
            </StackPanel>            
            <UniformGrid Columns="1">
                <d3:ChartPlotter Name ="timeDomainPlotter" >
                </d3:ChartPlotter>
                <d3:ChartPlotter Name ="freqDomainPlotter" >
                </d3:ChartPlotter>
            </UniformGrid>          
        </StackPanel>
    </Grid>
</Window>

しかし、それでも、期待どおりに上部のD3グラフを最大化することはできません。それでもウィンドウの半分しかかかりません。背後のコードで何をすべきですか?

4

3 に答える 3

2
<Window x:Class="FileWatcherCaller.View.SignalStatsDisplay"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0"
    Title="Real Time Signal Display" Height="409" Width="1200">

    <Grid> 
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <StackPanel Orientation="Horizontal" Grid.Row="0">
            <CheckBox Height="16" HorizontalAlignment="Left" Name="pixVal" VerticalAlignment="Top" Width="120" Checked="checkBox1_Checked">Pixel Value</CheckBox>
            <CheckBox Height="16" HorizontalAlignment="Left" Name="roiMean" VerticalAlignment="Top" Width="120">ROI Mean</CheckBox>
            <CheckBox Height="16" HorizontalAlignment="Left" Name="roiStd" VerticalAlignment="Top" Width="120" Checked="roiStd_Checked">ROI Std</CheckBox>
        </StackPanel>            
        <UniformGrid Columns="1" Grid.Row="1">
            <d3:ChartPlotter Name ="timeDomainPlotter" >
            </d3:ChartPlotter>
            <d3:ChartPlotter Name ="freqDomainPlotter" >
            </d3:ChartPlotter>
        </UniformGrid>  
    </Grid>
</Window>
于 2013-02-19T21:21:44.350 に答える
2

UniformGrid探している方法で動作します(ユーザーが2つのセクションのサイズを変更しない限り)

<UniformGrid Columns="1">
<TextBox Visibility="Collapsed">Hello</TextBox>
<TextBox Visibility="Visible">Goodbye</TextBox>
</UniformGrid>

もっと柔軟なものを作るには、コードを書かなければならないと思います。

于 2013-02-19T17:19:58.837 に答える
1

目的の動作をするアプリの例を次に示します。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:VisibilityToHeightConverter x:Key="VisToHeightConv"/>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="{Binding ElementName=rctTop, Path=Visibility, Converter={StaticResource VisToHeightConv}}" Name="RowOne" />
            <RowDefinition Height="{Binding ElementName=rctBottom, Path=Visibility, Converter={StaticResource VisToHeightConv}}" Name="RowTwo" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Rectangle Fill="Black" Name="rctTop" Grid.Row="0"/>
        <Rectangle Fill="Red" Name="rctBottom" Grid.Row="1"/>
    </Grid>
</Window>

コードビハインド:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
}
public class VisibilityToHeightConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        GridLength height = new GridLength();

        var visiblity = (Visibility)value;
        switch(visiblity)
        {
            case Visibility.Collapsed:
                height = new GridLength(0, GridUnitType.Auto);
                break;
            case Visibility.Visible:
                height = new GridLength(1, GridUnitType.Star);
                break;
            case Visibility.Hidden:
                height = new GridLength(0, GridUnitType.Auto);
                break;
        }

        return height;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

このコードのいずれかの部分がなじみのないもの(値コンバーター、バインディング)であるかどうかをお知らせください。説明を提供します。

于 2013-02-19T17:31:43.207 に答える