जब मैं उस पर क्लिक करता हूं तो मैं स्लाइड करने के लिए एक बटन बनाने की कोशिश कर रहा हूं। ऐसा करने के लिए, मैंने इसकी कॉलम चौड़ाई बदलने के लिए ग्रिड बनाया है ताकि बटन चारों ओर घूमने लगे:

छवि विवरण यहां दर्ज करें छवि विवरण यहां दर्ज करें

जब मैं ग्रिड पर क्लिक करता हूं, तो पहले कॉलम की चौड़ाई चेक की जाती है। यदि यह 0 है, तो इसे ग्रिड की चौड़ाई में बदल दिया जाता है। दूसरे पक्ष के लिए वही।

मैं इसे एक एनीमेशन में करना चाहता हूं, इसलिए समय के भीतर चौड़ाई बदल गई, इसलिए मैंने कॉलम की चौड़ाई को संशोधित करने के लिए लूप के लिए किया ताकि जब मैं उस पर क्लिक करूं तो स्लाइडर हिल जाए।

मेरा कोड नीचे:

private void MouseLeftDown_TwoSideButton(object sender, MouseButtonEventArgs e)
{
    double width = TwoSideButton.ActualWidth;
    double desiredColumnWidth = width - (TwoSideButton_Mid1Column.ActualWidth + TwoSideButton_Mid2Column.ActualWidth);

    int steps = 5;
    double stepSize = desiredColumnWidth / steps;

    bool leftSelected = true ? TwoSideButton_LeftSideColumn.ActualWidth == 0 : false;

    // Here I want to see the changes during for loop, not at the end of the loop.
    for (int i = 1; i <= steps; i++)
    {
        if (leftSelected)
        {
            TwoSideButton_LeftSideColumn.Width = new GridLength(i * stepSize);
            TwoSideButton_RightSideColumn.Width = new GridLength(desiredColumnWidth - i * stepSize);
        }
        else if (!leftSelected)
        {
            TwoSideButton_LeftSideColumn.Width = new GridLength(desiredColumnWidth - i * stepSize);
            TwoSideButton_RightSideColumn.Width = new GridLength(i * stepSize);
        }
    }
}

और एक्सएएमएल कोड:

<Grid x:Name="TwoSideButton" Width="200" Height="25" Grid.Column="1" Grid.Row="6" MouseLeftButtonDown="MouseLeftDown_TwoSideButton">
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="TwoSideButton_LeftSideColumn" Width="0"/>
        <ColumnDefinition x:Name="TwoSideButton_Mid1Column" Width="20"/>
        <ColumnDefinition x:Name="TwoSideButton_Mid2Column" Width="20"/>
        <ColumnDefinition x:Name="TwoSideButton_RightSideColumn" Width="*"/>
    </Grid.ColumnDefinitions>

    <Border Grid.Column="0" CornerRadius="5" BorderThickness="1" BorderBrush="Black" Background="DarkOrange"  Grid.ColumnSpan="2"/>
    <Border Grid.Column="2" CornerRadius="5" BorderThickness="1" BorderBrush="Black" Background="RoyalBlue"  Grid.ColumnSpan="2"/>
    <Border Grid.Column="1" CornerRadius="5" Grid.ColumnSpan="2" BorderBrush="Black" BorderThickness="1">
        <Border.Background>
            <LinearGradientBrush EndPoint="1,0" StartPoint="1,1">
                <GradientStop Color="LightGray" Offset="0.9"/>
                <GradientStop Color="Gray"/>
            </LinearGradientBrush>
        </Border.Background>
    </Border>
    <TextBlock x:Name="TwoSideButton_LeftText" Text="Trabajando" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    <TextBlock x:Name="TwoSideButton_RightText" Text="Terminado" Grid.Column="3" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>

धन्यवाद!

1
Rodrigo 25 नवम्बर 2020, 17:34

1 उत्तर

सबसे बढ़िया उत्तर

जब आपका लूप अभी भी चल रहा हो तो ग्रिड अपने आप रीफ्रेश नहीं हो सकता

एक संभावित समाधान यह है कि अपने लूप के अंदर एक प्रतीक्षा विलंब जोड़कर पूरे ईवेंट हैंडलर को अतुल्यकालिक बनाया जाए:

await Task.Delay(100);

संकलित करने के लिए आपको अपने ईवेंट हैंडलर को async के रूप में चिह्नित करना होगा:

private async void MouseLeftDown_TwoSideButton(object sender, MouseButtonEventArgs e)
1
Clemens 25 नवम्बर 2020, 18:30