He realizado un servicio web para instalar un programa.

public string GetListapp()
{


    string result = "";
    string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
    using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
    {
        foreach (string sbnm in key.GetSubKeyNames())
        {
            using (RegistryKey subkey = key.OpenSubKey(sbnm))
            {
                string appVersion = (string)subkey.GetValue("DisplayVersion");
                String app = Convert.ToString(subkey.GetValue("DisplayName"));



                if (app != "")
                    result += appVersion + app + "\r\n";


            }
        }
    }
    return result;
}
}

También creé una interfaz simple. Funciona bien con el cuadro de texto, pero también necesito obtener displayname displayversion & publisher

Hice esto primero:

 private void btnGIA_Click(object sender, RoutedEventArgs e)
    {
        MYS.ServiceClient pk = new MYS.ServiceClient();
        textBox1.Text = pk.GetListapp();

    }

Pero ahora necesito agregar esto al listbox

 MYS.ServiceClient pk = new MYS.ServiceClient();
 listBox.ItemsSource = pk.GetListapp();

Pero cuando hago eso y selecciono una plantilla en el cuadro de lista como este

<ControlTemplate x:Key="ListBoxControlTemplate1" TargetType="{x:Type ListBox}">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="91*"/>
                <ColumnDefinition Width="106*"/>
                <ColumnDefinition Width="113*"/>
            </Grid.ColumnDefinitions>
            <TextBox x:Name="textBox" Height="Auto" TextWrapping="Wrap" Text="{Binding result}" Width="Auto"/>
            <TextBox x:Name="textBox1" Grid.Column="1" Height="Auto" TextWrapping="Wrap" Text="{Binding DisplayVersion}" Width="Auto"/>
            <TextBox x:Name="textBox2" Grid.Column="2" Height="Auto" TextWrapping="Wrap" Text="TextBox" Width="Auto"/>
        </Grid>
    </ControlTemplate>

Hago clic en un botón pero no pasa nada.

0
Rodriguez 29 dic. 2016 a las 19:04

1 respuesta

La mejor respuesta

Debe establecer la propiedad ItemsSource de ListBox en un IEnumerable, es decir, normalmente algún tipo de colección de algunos objetos.

Dado que su método GetListapp () solo devuelve una sola cadena, puede crear una List y agregar la cadena que obtiene del servicio a esta:

MYS.ServiceClient pk = new MYS.ServiceClient();
listBox.ItemsSource = new List<string> { pk.GetListapp(); }

La otra opción sería devolver un objeto con dos propiedades del método de servicio. Crear una clase:

public class MyItem
{
    public string DisplayVersion { get; set; }
    public string DisplayName { get; set; }
}

... y devolver una lista de dichos objetos del servicio:

public List<MyItem> GetListapp()
{

    List<MyItem> items = new List<MyItem>();
    string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
    using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
    {
        foreach (string sbnm in key.GetSubKeyNames())
        {
            using (RegistryKey subkey = key.OpenSubKey(sbnm))
            {
                string appVersion = (string)subkey.GetValue("DisplayVersion");
                String app = Convert.ToString(subkey.GetValue("DisplayName"));

                if (app != "")
                    items.Add(new MyItem() { DisplayName = app, DisplayVersion = appVersion });
            }
        }
    }
    return items;
}

A continuación, puede establecer la propiedad ItemsSource del ListBox en esta lista directamente:

MYS.ServiceClient pk = new MYS.ServiceClient();
listBox.ItemsSource = pk.GetListapp();

... y use un ItemTemplate (no un ControlTemplate) para definir la apariencia de los elementos en el ListBox:

<ListBox x:Name="listBox">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding DisplayVersion}" />
                <TextBlock Text="{Binding DisplayName}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
0
mm8 29 dic. 2016 a las 19:47
Muchas gracias por tu respuesta realmente genial intentaré hacer eso ahora
 – 
Rodriguez
30 dic. 2016 a las 00:39