For simplicities sake strip out all the MVVM parts and simplify the example down to the bare minimum
(Code is declared in the MainWindow now)
This commit is contained in:
		@@ -1,8 +1,9 @@
 | 
			
		||||
<Application x:Class="CefSharp.MinimalExample.Wpf.App"
 | 
			
		||||
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 | 
			
		||||
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 | 
			
		||||
             xmlns:binding="clr-namespace:CefSharp.MinimalExample.Wpf.Binding"
 | 
			
		||||
             StartupUri="MainWindow.xaml">
 | 
			
		||||
    <Application.Resources>
 | 
			
		||||
         
 | 
			
		||||
        <binding:TitleConverter x:Key="TitleConverter"/>
 | 
			
		||||
    </Application.Resources>
 | 
			
		||||
</Application>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								CefSharp.MinimalExample.Wpf/Binding/TitleConverter.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								CefSharp.MinimalExample.Wpf/Binding/TitleConverter.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Globalization;
 | 
			
		||||
using System.Windows.Data;
 | 
			
		||||
 | 
			
		||||
namespace CefSharp.MinimalExample.Wpf.Binding
 | 
			
		||||
{
 | 
			
		||||
    public class TitleConverter : IValueConverter
 | 
			
		||||
    {
 | 
			
		||||
        object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            return "CefSharp.MinimalExample.Wpf - " + (value ?? "No Title Specified");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
 | 
			
		||||
        {
 | 
			
		||||
            return System.Windows.Data.Binding.DoNothing;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -78,10 +78,6 @@
 | 
			
		||||
      <Generator>MSBuild:Compile</Generator>
 | 
			
		||||
      <SubType>Designer</SubType>
 | 
			
		||||
    </ApplicationDefinition>
 | 
			
		||||
    <Compile Include="Views\MainView.xaml.cs">
 | 
			
		||||
      <DependentUpon>MainView.xaml</DependentUpon>
 | 
			
		||||
    </Compile>
 | 
			
		||||
    <Compile Include="ViewModels\MainViewModel.cs" />
 | 
			
		||||
    <Page Include="MainWindow.xaml">
 | 
			
		||||
      <Generator>MSBuild:Compile</Generator>
 | 
			
		||||
      <SubType>Designer</SubType>
 | 
			
		||||
@@ -90,17 +86,13 @@
 | 
			
		||||
      <DependentUpon>App.xaml</DependentUpon>
 | 
			
		||||
      <SubType>Code</SubType>
 | 
			
		||||
    </Compile>
 | 
			
		||||
    <Compile Include="Binding\TitleConverter.cs" />
 | 
			
		||||
    <Compile Include="MainWindow.xaml.cs">
 | 
			
		||||
      <DependentUpon>MainWindow.xaml</DependentUpon>
 | 
			
		||||
      <SubType>Code</SubType>
 | 
			
		||||
    </Compile>
 | 
			
		||||
    <Page Include="Views\MainView.xaml">
 | 
			
		||||
      <Generator>MSBuild:Compile</Generator>
 | 
			
		||||
      <SubType>Designer</SubType>
 | 
			
		||||
    </Page>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <Compile Include="Mvvm\PropertyChangedExtensionMethods.cs" />
 | 
			
		||||
    <Compile Include="Properties\AssemblyInfo.cs">
 | 
			
		||||
      <SubType>Code</SubType>
 | 
			
		||||
    </Compile>
 | 
			
		||||
@@ -131,6 +123,7 @@
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <Resource Include="chromium-256.ico" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup />
 | 
			
		||||
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
 | 
			
		||||
  <Import Project="..\packages\cef.redist.x86.3.2454.1344\build\cef.redist.x86.targets" Condition="Exists('..\packages\cef.redist.x86.3.2454.1344\build\cef.redist.x86.targets')" />
 | 
			
		||||
  <Import Project="..\packages\cef.redist.x64.3.2454.1344\build\cef.redist.x64.targets" Condition="Exists('..\packages\cef.redist.x64.3.2454.1344\build\cef.redist.x64.targets')" />
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,26 @@
 | 
			
		||||
<Window x:Class="CefSharp.MinimalExample.Wpf.MainWindow"
 | 
			
		||||
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 | 
			
		||||
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 | 
			
		||||
        xmlns:main="clr-namespace:CefSharp.MinimalExample.Wpf.Views"
 | 
			
		||||
        Title="{Binding WebBrowser.Title}"
 | 
			
		||||
        xmlns:wpf="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
 | 
			
		||||
        Title="{Binding Path=Title, ElementName=Browser, Converter={StaticResource TitleConverter}}"
 | 
			
		||||
        WindowState="Maximized">
 | 
			
		||||
    <main:MainView/>
 | 
			
		||||
    <Grid>
 | 
			
		||||
        <Grid.RowDefinitions>
 | 
			
		||||
            <RowDefinition />
 | 
			
		||||
            <RowDefinition Height="Auto" />
 | 
			
		||||
        </Grid.RowDefinitions>
 | 
			
		||||
        <wpf:ChromiumWebBrowser Grid.Row="0"
 | 
			
		||||
                          x:Name="Browser"
 | 
			
		||||
                          Address="http://www.google.com" />
 | 
			
		||||
        <StatusBar Grid.Row="1">
 | 
			
		||||
            <ProgressBar HorizontalAlignment="Right"
 | 
			
		||||
                         IsIndeterminate="{Binding WebBrowser.IsLoading}"
 | 
			
		||||
                         Width="100"
 | 
			
		||||
                         Height="16"
 | 
			
		||||
                         Margin="3" />
 | 
			
		||||
            <Separator />
 | 
			
		||||
            <!-- TODO: Could show hover link URL here -->
 | 
			
		||||
            <TextBlock />
 | 
			
		||||
        </StatusBar>
 | 
			
		||||
    </Grid>
 | 
			
		||||
</Window>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,48 +0,0 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.ComponentModel;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
 | 
			
		||||
namespace CefSharp.MinimalExample.Wpf.Mvvm
 | 
			
		||||
{
 | 
			
		||||
    public static class PropertyChangedExtensionMethods
 | 
			
		||||
    {
 | 
			
		||||
        // Based on http://www.wpftutorial.net/INotifyPropertyChanged.html
 | 
			
		||||
        public static bool ChangeAndNotify<T>(this PropertyChangedEventHandler handler,
 | 
			
		||||
             ref T field, T value, Expression<Func<T>> memberExpression)
 | 
			
		||||
        {
 | 
			
		||||
            if (memberExpression == null)
 | 
			
		||||
            {
 | 
			
		||||
                throw new ArgumentNullException("memberExpression");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var body = memberExpression.Body as MemberExpression;
 | 
			
		||||
            if (body == null)
 | 
			
		||||
            {
 | 
			
		||||
                throw new ArgumentException("Lambda must return a property.");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (EqualityComparer<T>.Default.Equals(field, value))
 | 
			
		||||
            {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            field = value;
 | 
			
		||||
 | 
			
		||||
            var vmExpression = body.Expression as ConstantExpression;
 | 
			
		||||
            if (vmExpression != null)
 | 
			
		||||
            {
 | 
			
		||||
                var lambda = Expression.Lambda(vmExpression);
 | 
			
		||||
                var vmFunc = lambda.Compile();
 | 
			
		||||
                var sender = vmFunc.DynamicInvoke();
 | 
			
		||||
 | 
			
		||||
                if (handler != null)
 | 
			
		||||
                {
 | 
			
		||||
                    handler(sender, new PropertyChangedEventArgs(body.Member.Name));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,39 +0,0 @@
 | 
			
		||||
using CefSharp.MinimalExample.Wpf.Mvvm;
 | 
			
		||||
using CefSharp.Wpf;
 | 
			
		||||
using System.ComponentModel;
 | 
			
		||||
using System.Windows;
 | 
			
		||||
 | 
			
		||||
namespace CefSharp.MinimalExample.Wpf.ViewModels
 | 
			
		||||
{
 | 
			
		||||
    public class MainViewModel
 | 
			
		||||
    {
 | 
			
		||||
        public event PropertyChangedEventHandler PropertyChanged;
 | 
			
		||||
 | 
			
		||||
        private IWpfWebBrowser webBrowser;
 | 
			
		||||
        public IWpfWebBrowser WebBrowser
 | 
			
		||||
        {
 | 
			
		||||
            get { return webBrowser; }
 | 
			
		||||
            set { PropertyChanged.ChangeAndNotify(ref webBrowser, value, () => WebBrowser); }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private string title;
 | 
			
		||||
        public string Title
 | 
			
		||||
        {
 | 
			
		||||
            get { return title; }
 | 
			
		||||
            set { PropertyChanged.ChangeAndNotify(ref title, value, () => Title); }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public MainViewModel()
 | 
			
		||||
        {
 | 
			
		||||
            PropertyChanged += OnPropertyChanged;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
 | 
			
		||||
        {
 | 
			
		||||
            if (e.PropertyName == "Title")
 | 
			
		||||
            {
 | 
			
		||||
                Application.Current.MainWindow.Title = "CefSharp.MinimalExample.Wpf - " + Title;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,30 +0,0 @@
 | 
			
		||||
<UserControl x:Class="CefSharp.MinimalExample.Wpf.Views.MainView"
 | 
			
		||||
             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:cefSharp="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
 | 
			
		||||
             mc:Ignorable="d"
 | 
			
		||||
             d:DesignWidth="640"
 | 
			
		||||
             d:DesignHeight="300">
 | 
			
		||||
    <Grid>
 | 
			
		||||
        <Grid.RowDefinitions>
 | 
			
		||||
            <RowDefinition />
 | 
			
		||||
            <RowDefinition Height="Auto" />
 | 
			
		||||
        </Grid.RowDefinitions>
 | 
			
		||||
        <cefSharp:ChromiumWebBrowser Grid.Row="0"
 | 
			
		||||
                          Address="http://www.google.com"
 | 
			
		||||
                          WebBrowser="{Binding WebBrowser, Mode=OneWayToSource}"
 | 
			
		||||
                          Title="{Binding Title, Mode=TwoWay}" />
 | 
			
		||||
        <StatusBar Grid.Row="1">
 | 
			
		||||
            <ProgressBar HorizontalAlignment="Right"
 | 
			
		||||
                         IsIndeterminate="{Binding WebBrowser.IsLoading}"
 | 
			
		||||
                         Width="100"
 | 
			
		||||
                         Height="16"
 | 
			
		||||
                         Margin="3" />
 | 
			
		||||
            <Separator />
 | 
			
		||||
            <!-- TODO: Could show hover link URL here -->
 | 
			
		||||
            <TextBlock />
 | 
			
		||||
        </StatusBar>
 | 
			
		||||
    </Grid>
 | 
			
		||||
</UserControl>
 | 
			
		||||
@@ -1,14 +0,0 @@
 | 
			
		||||
using System.Windows.Controls;
 | 
			
		||||
using CefSharp.MinimalExample.Wpf.ViewModels;
 | 
			
		||||
 | 
			
		||||
namespace CefSharp.MinimalExample.Wpf.Views
 | 
			
		||||
{
 | 
			
		||||
    public partial class MainView : UserControl
 | 
			
		||||
    {
 | 
			
		||||
        public MainView()
 | 
			
		||||
        {
 | 
			
		||||
            InitializeComponent();
 | 
			
		||||
            DataContext = new MainViewModel();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user