3

監視可能なコレクションにバインドされた Listbox があり、XAML スニペットは各項目に何が含まれるかを示します (textblocks と Slidercontrol ) Slidercontrol は最初は非表示に設定されています

         ListBox.ItemTemplate>
             <DataTemplate>
               <StackPanel Orientation="Vertical" Width="500">

                 <stackPanel Orientation="Horizontal">
                   <TextBlock Margin="0,0,0,0"  Width="100"........
                   <TextBlock Margin="200,10,0,0" Width="100"........ 
                 </StackPanel>

                <Slider Margin="0,0,0,0" Height="100".................

                 <StackPanel Orientation="Horizontal">
                   <TextBlock Width="100" TextWrapping="Wrap"..............
                   <TextBlock Width="100" TextWrapping="Wrap"...............
                 </StackPanel>                                
              </StackPanel>
            </DataTemplate>
         </ListBox.ItemTemplate>

特定の Time プロパティの observableCollection リスト オブジェクトを最初に確認したいのですが、時間が現在のシステム時間内にある場合は、対応するスライダー コントロール ListBox アイテムをアクティブにして更新したい silder は時間の経過を示し、終了時間まで更新され、ユーザーは移動できませんそれ、しかし、ListBoxitemにアクセスまたは反復して、visualhelptree.HELPを介してSliderコントロールをアクティブにできるようにする方法!!!!!!

4

2 に答える 2

2

再更新


まず第一にSlider、時間の進行状況を確認するために を使用している限り、使用する適切なコントロールはProgressBarコントロールです (Sliderコントロールは、ユーザーが値を変更できるようにするために使用されます。たとえば、メディア プレーヤーの音量を変更します)。 )。さらに、を使用せずに、これをより簡単に実装できますTreeVisualHelperObservableCollectionあなたが次のオブジェクトにバインドしているとしましょう:

ObservableCOllection<MyObject> Collection;

MyObjectクラスを編集し、doubleプロパティを追加して の進捗値を示しますProgressBar。さらに、5 分ごとに起動するオブジェクトを追加しTimerて 2 回をチェックし、次のようにブール値を変更してスライダーを有効にするかどうかを決定します。

public class MyObject
{
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }

    public double ProgressValue { get; set; }
    private System.Timers.Timer TimeChecker;

    public MyObject()
    {
         // 5 Minutes = 5 * 60 Seconds = 5 * 60 * 1000 Milliseconds
         TimeChecker = new Timer(300000);
         TimeChecker.Elapsed += CheckTimes;
    }


    public CheckTimes()
    {
         // Check StartTime and EndTime to decide whether to enable the slider or not.
         if(...)
         {
              // Here you can add the appropriate value to indicate the current progress
              ProgressValue == ....;
         }
         else
              ProgressValue == ....;
    }
}

次に、アイテム テンプレートで、ProgressBar.ValueプロパティをプロパティにバインドしますProgressValue。次のようになります。

<BrogressBar Value="{Binding ProgressValue}"/>

このようにして、各アイテムには独自のタイマーがあります。コレクションを 5 分ごとに繰り返し処理し、必要なことを行うタイマーを 1 つだけ持つよりも優れた代替手段です。

于 2012-04-25T12:14:30.103 に答える
1

ValueConverter を試してください - 次のようなものが必要です:

<Slider Margin="0,0,0,0" Height="100" IsEnabled="{Binding Path=Time, Converter={StaticResource IsTimeNearSystemTimeConverter}}" />

編集

マルチバリューコンバーターでマルチバインディングを行う必要があるようです

public class BetweenTimesMultiValueConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var time1 = (DateTime)values[0];
        var time2 = (DateTime)values[1];
        var current = DateTime.Now;
        return time1 > current && time2 < current;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

上記のクラスを xaml の静的リソースとして追加し、次のように使用します。

<Slider Margin="0,0,0,0" Height="100">
    <Slider.IsEnabled>
        <MultiBinding Converter="{StaticResource betweenTimeConverter}">
            <Binding Path="EarlyTime" />
            <Binding Path="LateTime" />
        </MultiBinding>
    </Slider.IsEnabled>
</Slider>
于 2012-04-25T11:52:49.067 に答える