2 messaggi dal 30 aprile 2013
Buondì :)

Spiego il più brevemente possibile l'obiettivo ed il mio problema.

La mia applicazione WPF è un insieme di User Control, dove:
- nella MainWindow eseguo Login e logica variegata
- visualizzo una DataGrid a seguito di una ricerca effettuata via servizio WCF
- a seguito del click sul singolo documento della grid precedente, visualizzo una nuova schermata dove, a sinistra mostro la struttura alberata del documento, a destra il contenuto di questo documento.

Il mio problema è riuscire a "linkare" ed aprire, a seguito di un singolo click su uno di quei nodi, l'estratto esatto di quel documento.

Per prima cosa, non riesco proprio a scatenare l'evento e non capisco come mai..

Codice XAML Struttura:

<UserControl x:Class="Client.UserControls.DocumentView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="800"  d:DesignWidth="900"
             xmlns:controls="clr-namespace:Client.UserControls">
    <Grid x:Name="grdTop">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="220"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <StackPanel Grid.Column="0" Grid.ColumnSpan="2">
            <Label FontSize="14" FontWeight="Bold" VerticalAlignment="Center" HorizontalAlignment="Center">Struttura</Label>
            <TreeView x:Name="treeView" HorizontalAlignment="Left" Width="200">
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                        <HierarchicalDataTemplate.Resources>
                            <Style TargetType="{x:Type TreeViewItem}">
                                <EventSetter Event="MouseLeftButtonDown" Handler="OnTreeNodeMouseClick" />
                            </Style>
                        </HierarchicalDataTemplate.Resources>
                        <TreeViewItem Header="{Binding Text}" x:Name="treeViewItem" HorizontalAlignment="Left" HorizontalContentAlignment="Left">
                        </TreeViewItem>
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
            </TreeView>
        </StackPanel>
        <StackPanel Grid.Column="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
            <controls:TabDocumentViewLeggeControl x:Name="topTab" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Grid.Row="0" />
        </StackPanel>
    </Grid>
</UserControl>


CodeBehind Struttura:

using ClientHelper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Client.UserControls
{
    public partial class DocumentView : UserControl
    {
        public DocumentView()
        {
            InitializeComponent();         
        }

        public void SetTreeViewNodeStruttura(IList<TreeViewNode> nodes)
        {
            this.treeViewStruttura.ItemsSource = nodes;
        }

        public void OnTreeNodeMouseClick(object sender, RoutedEventArgs e)
        {
        }
    }
}


Secondo User Control dove aprire il documento:
<UserControl x:Class="Client.UserControls.TabDocumentViewLawControl"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                 xmlns:editor="clr-namespace:RichEditor;assembly=RichEditor"
                 mc:Ignorable="d"
                 d:DesignHeight="500" d:DesignWidth="500"
                 xmlns:vm="clr-namespace:Domain.Model.Document;assembly=Domain">
      <UserControl.Resources>
        <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
      </UserControl.Resources>
      <ScrollViewer Grid.Row="5" Grid.Column="1" MaxHeight="250">
        <StackPanel>
          <FlowDocumentReader x:Name="articoloDocumentLaw"  Grid.Row="1" Document="{Binding Path=FlowDocumentArticle}"
                           Visibility="{Binding Path=HasArticoloVisible, Converter={StaticResource BooleanToVisibilityConverter}}" />
        </StackPanel>
      </ScrollViewer>
</UserControl>


MainWindow, dove recupero l'oggetto restituito dal servizio, lo associo al datacontext dello user control dove visualizzarlo, istanzio la factory per popolare ricorsivamente l'alberatura e poi valorizzo la proprietà documentStruttura (di document)

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.Loaded += MainWindow_Loaded;
        this.login.btnLogin.Click += btnLogin_Click;
        this.tabMainControl.resultListControl.RowSelected += resultListControl_RowSelected;
    }

    void resultListControl_RowSelected(object sender, EventArgs e)
    {
        AutonomySearchResult selectedDocument = (AutonomySearchResult)this.tabMainControl.resultListControl.grdResult.SelectedItem;
        this.tabMainControl.topTabControl.SelectedItem = this.tabMainControl.tabResultList;
        Services.ServicesClient client = new Services.ServicesClient();
        var document = client.GetDocument(selectedDocument.DocKey, true);

        this.tabMainControl.topTabControl.SelectedItem = this.tabMainControl.tabDocumentView;
        this.tabMainControl.tabDocumentView.DataContext = document;

        TreeViewFactory treeFactory = new TreeViewFactory();
        var documentStructure= treeFactory.GetStructure(document.DocumentKey, document.XmlStructure, true);
        this.tabMainControl.documentView.SetTreeViewNodeStructure(documentStructure);
}
}


TreeViewFactory:

public class TreeViewFactory
    {

        public IList<TreeViewNode> GetStruttura(DocumentKey docKey, string struttura, bool loadAllParents)
{
//logica per popolare i nodi
}

public class TreeViewNode
{
        public TreeViewNode() { }

        public DocumentKey DocKey { get; set; }

        public string Text { get; set; }

        public IList<TreeViewNode> Children { get; set; }
}



Grazie mille in anticipo :)
10.905 messaggi dal 09 febbraio 2002
Contributi
Ciao,
penso che non sia necessario gestire l'evento MouseLeftButtonDown, infatti la TreeView risponde già ai click col tasto sinistro selezionando il nodo su cui si è cliccato.

Dunque ti basterebbe creare una DependencyProperty nel tuo UserControl e metterla in Binding con la proprietà SelectedItem della TreeView.
In questo modo, ogni qualvolta la selezione cambia, il tuo usercontrol ne viene notificato e là avrai un'opportunità di aprire il giusto estratto dal documento.

ciao

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.