0

ここに私のコード全体があります:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    private void sldChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
        double red, green, blue;
        red = sldRed.Value;
        green = sldGreen.Value;
        blue = sldBlue.Value;
        changeColors(red, green, blue);
    }

    private void inputChanged(object sender, TextChangedEventArgs e)
    {
        double red, green, blue;
        red = Convert.ToDouble(txtRed.Text);
        green = Convert.ToDouble(txtGreen.Text);
        blue = Convert.ToDouble(txtBlue.Text);
        sldRed.Value = red;
        sldGreen.Value = green;
        sldBlue.Value = blue;
        changeColors(red, green, blue);
    }

    void changeColors(double red, double green, double blue)
    {

    }

    private void Window_Loaded_1(object sender, RoutedEventArgs e)
    {
        txtRed.Text = Convert.ToString(sldRed.Value);
        txtGreen.Text = Convert.ToString(sldGreen.Value);
        txtBlue.Text = Convert.ToString(sldBlue.Value);
    }
}

これが私の .xaml コード全体です。

<Grid x:Name="frmGrid" Margin="0,0,2,0">
    <Slider x:Name="sldRed" HorizontalAlignment="Left" Margin="57,10,0,0" VerticalAlignment="Top" Width="757" ValueChanged="sldChanged" ClipToBounds="True" Maximum="255" TickPlacement="BottomRight" IsSnapToTickEnabled="True" SmallChange="1" Value="1"/>
    <Slider x:Name="sldBlue" HorizontalAlignment="Left" Margin="57,76,0,0" VerticalAlignment="Top" Width="757" ValueChanged="sldChanged" ClipToBounds="True" Maximum="255" TickPlacement="BottomRight" IsSnapToTickEnabled="True" SmallChange="1" Value="1"/>
    <Slider x:Name="sldGreen" HorizontalAlignment="Left" Margin="57,45,0,0" VerticalAlignment="Top" Width="757" ValueChanged="sldChanged" ClipToBounds="True" Maximum="255" TickPlacement="BottomRight" IsSnapToTickEnabled="True" SmallChange="1" Value="1"/>
    <Label Content="Red" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>
    <Label Content="Blue" HorizontalAlignment="Left" Margin="10,72,0,0" VerticalAlignment="Top"/>
    <Label Content="Green" HorizontalAlignment="Left" Margin="10,41,0,0" VerticalAlignment="Top"/>
    <TextBox x:Name="txtRed" HorizontalAlignment="Left" Height="23" Margin="819,9,0,0" TextWrapping="Wrap" Text="1" VerticalAlignment="Top" Width="41" TextChanged="inputChanged"/>
    <TextBox x:Name="txtBlue" HorizontalAlignment="Left" Height="23" Margin="819,74,0,0" TextWrapping="Wrap" Text="1" VerticalAlignment="Top" Width="41" TextChanged="inputChanged"/>
    <TextBox x:Name="txtGreen" HorizontalAlignment="Left" Height="23" Margin="819,41,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="41" TextChanged="inputChanged" Text="1"/>

</Grid>

テスト目的でこれらのテキスト ボックスに値を割り当てたことがわかります。

何らかの理由で、このエラーが発生し続けます ここに画像の説明を入力

これらの2行を指します。

green = Convert.ToDouble(txtGreen.Text);
blue = Convert.ToDouble(txtBlue.Text);

その上の同様の行が完全に機能することに注意してください

red = Convert.ToDouble(txtRed.Text);

私はまだ C# の経験がなく、そのようなエラーを読む経験もありません。このエラーが発生する理由について何か考えがあり、可能な解決策を提供していただければ幸いです。

PS: 何か役に立つかもしれないと思ったのですが、プログラムが起動する前にこのエラーが発生します。

これは 2 つのスクリーンショットです。1 つはまったく読み込まれませんが、2 番目は完全に読み込まれて動作します。 ここに画像の説明を入力 ここに画像の説明を入力

4

4 に答える 4

2

txtRed and txtBlue値が含まれていません。しかし、txtRedには値が含まれています

コントロールが空でないことを確認するために、検証スクリプトを追加できます

于 2012-10-11T18:12:27.720 に答える
0

Window_Loaded_1問題は、テキストボックスのテキスト値が変更され、inputChangedメソッドが呼び出されることにあると思います。コードをコメントアウトしてWindow_Loaded_1、例外がまだ発生するかどうかを確認してください。

この問題を解決する 1 つの方法は、バインドを使用して、スライダーとテキスト ボックスの値を結び付けることです。xaml は次のようになります。

<Grid x:Name="frmGrid" Margin="0,0,2,0">
    <Slider x:Name="sldRed" HorizontalAlignment="Left" Margin="57,10,0,0" VerticalAlignment="Top" Width="757" ValueChanged="sldChanged" ClipToBounds="True" Maximum="255" TickPlacement="BottomRight" IsSnapToTickEnabled="True" SmallChange="1" Value="1"/>
    <Slider x:Name="sldBlue" HorizontalAlignment="Left" Margin="57,76,0,0" VerticalAlignment="Top" Width="757" ValueChanged="sldChanged" ClipToBounds="True" Maximum="255" TickPlacement="BottomRight" IsSnapToTickEnabled="True" SmallChange="1" Value="1"/>
    <Slider x:Name="sldGreen" HorizontalAlignment="Left" Margin="57,45,0,0" VerticalAlignment="Top" Width="757" ValueChanged="sldChanged" ClipToBounds="True" Maximum="255" TickPlacement="BottomRight" IsSnapToTickEnabled="True" SmallChange="1" Value="1"/>
    <Label Content="Red" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>
    <Label Content="Blue" HorizontalAlignment="Left" Margin="10,72,0,0" VerticalAlignment="Top"/>
    <Label Content="Green" HorizontalAlignment="Left" Margin="10,41,0,0" VerticalAlignment="Top"/>

    <TextBox x:Name="txtRed" HorizontalAlignment="Left" Height="23" Margin="819,9,0,0" TextWrapping="Wrap" Text="{Binding ElementName=sldRed, Path=Value, Mode=TwoWay}" VerticalAlignment="Top" Width="41"/>

    <TextBox x:Name="txtBlue" HorizontalAlignment="Left" Height="23" Margin="819,74,0,0" TextWrapping="Wrap" Text="{Binding ElementName=sldBlue, Path=Value, Mode=TwoWay}" VerticalAlignment="Top" Width="41"/>

    <TextBox x:Name="txtGreen" HorizontalAlignment="Left" Height="23" Margin="819,41,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="41" Text="{Binding ElementName=sldGreen, Path=Value, Mode=TwoWay}"/>


</Grid>

コードは次のようになります。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void sldChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
        red = sldRed.Value;
        green = sldGreen.Value;
        blue = sldBlue.Value;
        changeColors(red, green, blue);
    }

    void changeColors(double red, double green, double blue)
    {

    }
}

inputChangedスライダーの変更のみを取り除き、対応することができます

于 2012-10-11T20:19:07.870 に答える
0

The reason why this is failing is because the valuechanged event gets called when you initially create the slider in xaml and include this: Value="1". The event gets raised before the other controls are created, and thus the null exception.

WPF is built heavily upon the concept of binding, and you should utilize it as much as possible because it will make your life a lot easier. I altered your code to show you how to do it using bindings.

xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        x:Name="TheMainWindow">
    <Grid x:Name="frmGrid" Margin="0,0,2,0">
        <Slider x:Name="sldRed" HorizontalAlignment="Left" Margin="57,10,0,0" VerticalAlignment="Top" Width="757" ClipToBounds="True" Maximum="255" TickPlacement="BottomRight" IsSnapToTickEnabled="True" 
                SmallChange="1" Value="{Binding Path=Red, ElementName=TheMainWindow, Mode=TwoWay}"/>
        <Slider x:Name="sldBlue" HorizontalAlignment="Left" Margin="57,76,0,0" VerticalAlignment="Top" Width="757" ClipToBounds="True" Maximum="255" TickPlacement="BottomRight" IsSnapToTickEnabled="True" 
                SmallChange="1" Value="{Binding Path=Blue, ElementName=TheMainWindow, Mode=TwoWay}"/>
        <Slider x:Name="sldGreen" HorizontalAlignment="Left" Margin="57,45,0,0" VerticalAlignment="Top" Width="757" ClipToBounds="True" Maximum="255" TickPlacement="BottomRight" IsSnapToTickEnabled="True"
                SmallChange="1" Value="{Binding Path=Green, ElementName=TheMainWindow, Mode=TwoWay}"/>
        <Label Content="Red" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>
        <Label Content="Blue" HorizontalAlignment="Left" Margin="10,72,0,0" VerticalAlignment="Top"/>
        <Label Content="Green" HorizontalAlignment="Left" Margin="10,41,0,0" VerticalAlignment="Top"/>
        <TextBox x:Name="txtRed" HorizontalAlignment="Left" Height="23" Margin="819,9,0,0" TextWrapping="Wrap" Text="{Binding Path=Red, ElementName=TheMainWindow}" VerticalAlignment="Top" Width="41"/>
        <TextBox x:Name="txtBlue" HorizontalAlignment="Left" Height="23" Margin="819,74,0,0" TextWrapping="Wrap" Text="{Binding Path=Blue, ElementName=TheMainWindow}" VerticalAlignment="Top" Width="41" />
        <TextBox x:Name="txtGreen" HorizontalAlignment="Left" Height="23" Margin="819,41,0,0" TextWrapping="Wrap" VerticalAlignment="Top"  Text="{Binding Path=Green, ElementName=TheMainWindow}" Width="41" />
    </Grid>
</Window>

code

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private double _red = 1;
    public double Red
    {
        get { return _red; }
        set
        {
            _red = value;
            OnPropertyChanged("Red");
        }
    }

    private double _green = 1;
    public double Green
    {
        get { return _green; }
        set
        {
            _green = value;
            OnPropertyChanged("Green");
        }
    }

    private double _blue = 1;
    public double Blue
    {
        get { return _blue; }
        set
        {
            _blue = value;
            OnPropertyChanged("Blue");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
于 2012-10-11T21:13:28.393 に答える
0

入力が変更されると、イベント ハンドラーが起動します。いずれかのボックスでバックスペースを押すと、テキストは空の文字列または null になります。それらを double に変換することはできません。Convert.ToDouble() の代わりに Double.TryParse() を試して、実際に解析可能な入力であるかどうかを次のように判断します。

private void inputChanged(object sender, TextChangedEventArgs e)
{
    double red, green, blue;

    if(Double.TryParse(txtRed.Text, out red) &&
        Double.TryParse(txtGreen.Text, out green) &&
        Double.TryParse(txtBlue.Text, out blue)) 
    {
        sldRed.Value = red;
        sldGreen.Value = green;
        sldBlue.Value = blue;
        changeColors(red, green, blue);
    }
}

RGB TextBoxes のすべての値が有効な場合、if ステートメントは true になり、赤、緑、青が適切に設定されます。

もちろん、これは sldGreen と sldBlue が null でないことを前提としています。

于 2012-10-11T18:29:10.813 に答える