1

実行されていない Windows サービスのリストを表示するアプリケーションを作成しています。問題は、これらのサービスが発生した変更を反映する必要があることです。つまり、サービスが開始された場合、そのサービスは表示されたリストから削除する必要があります。

私は ListView を使用しました。コードは次のとおりです。

<Window.Resources>
    <ObjectDataProvider ObjectType="{x:Type local:NotifiableServiceController}"
    MethodName="GetServices" x:Key="ManageServices">
    </ObjectDataProvider>
</Window.Resources>

<Grid>
    <ListView Name="lstViewServices" Width="Auto" ItemsSource="{Binding Source={StaticResource ManageServices}}"
                SelectionMode="Single">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="SoftOne Services" DisplayMemberBinding="{Binding Path=DisplayName}" />
                <GridViewColumn Header="Status">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Path=Status}">
                            </TextBlock>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

そしてサービスリストを取得する関数:

public static ObservableCollection<NotifiableServiceController> GetServices()
        {
            ObservableCollection<NotifiableServiceController> oaServices = new ObservableCollection<NotifiableServiceController>();

            //Retrieving the services starting with "SQL"
            foreach (ServiceController sc in ServiceController.GetServices().Where(p => p.DisplayName.StartsWith("SQL")))
            {
                oaServices.Add(new NotifiableServiceController(sc));
            }

            return oaServices;
        }

NotifiableServiceController、関連付けられている Windows サービスのステータスを更新するために一定の間隔で更新されています。ただし、(関数から) 初めて取得したサービスのみGetServices()が更新されます。

それは今まで大丈夫です。リストビューに表示されているプロセスを停止するだけでよいのですが、XAML でスタイルまたはトリガーを使用して実行できると思いますか? はいの場合、どのように?

御時間ありがとうございます。

4

3 に答える 3

1

ListCollectioViewを使用し、 Filterプロパティを使用してフィルタリングする必要があると思います。まず、すべてのサービスをロードする必要があります。その後、Timer.Elapsedイベントを使用して N 秒ごとに更新できます。

于 2012-11-15T08:38:47.893 に答える
1

解決策は、ListView にスタイルを追加し、次のように ListViewItem をターゲットにすることでした。

<ListView.Resources>
    <Style TargetType="ListViewItem">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Status}" Value="Running">
                <Setter Property="ListBoxItem.Visibility" Value="Hidden" />
                <Setter Property="Height" Value="0" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</ListView.Resources>

Service に応じてStatus、ListViewItem の可視性と高さを設定できます

于 2012-11-15T10:04:07.033 に答える
0

ObservableCollection<NotifiableServiceController>バインドされているサービスから実行中のサービスを削除しListView、サービスが停止するたびに元に戻すだけです。すべてのサービスのコレクションを保持する場合は、そのための追加のコレクションを作成します。

于 2012-11-15T08:37:34.993 に答える