반응형

 

 

지난번에 사용해본 새로운 인터넷 브라우저 WebView2의 다운로드 이벤트 처리하는 것을 다뤄봄

 

웹뷰2 방식을 사용한 인터넷 브라우저에서 파일을 다운로드 하는 경우,

자동으로 다운로드 폴더에 파일이 저장되는데

 

이때 FileSaveDialog 를 사용하여 사용자가 원하는 경로에 파일 저장할 수 있도록 커스터마이징 한 방식

 

파일 형식과 파일명은 다운로드할 때 자동으로 지정되는 형식과 파일명을 그대로 사용하였다

 

따라서 아래 방식으로는 저장할 때 파일 형식은 변경이 불가능한데 파일명만 가능한 상태로

형식 변경을 원하면 따로 수정해서 사용해줘야함

 

 

//웹뷰2 저장 경로 지정 커스터마이징
static string webSaveFilePath = "";

private bool? getSaveWebFilePath(string filePath)
{
	try
	{
		string fileExt = System.IO.Path.GetExtension(filePath).ToString();
		int strLen = fileExt.Length;

		webSaveFilePath = null;
		SaveFileDialog dlg = new SaveFileDialog();
		dlg.FileName = System.IO.Path.GetFileName(filePath).ToString();
		dlg.Filter = fileExt.Substring(1, strLen-1) + "|*" + System.IO.Path.GetExtension(filePath).ToString();

		bool? result = dlg.ShowDialog();

		if (result == true)
		{
			webSaveFilePath = System.IO.Path.GetFullPath(dlg.FileName).ToString();
		}
		return result;
	}
	catch (Exception ex)
	{
		Trace.WriteLine(ex.Message);
		return false;
	}
}


//웹뷰2 다운로드 이벤트 발생
private void WB_DownloadStarting(object sender, Microsoft.Web.WebView2.Core.CoreWebView2DownloadStartingEventArgs e)
{
	Microsoft.Web.WebView2.Core.CoreWebView2Deferral deferral = e.GetDeferral();
	string filePath = e.DownloadOperation.ResultFilePath;

	bool? saveResult = getSaveWebFilePath(filePath);
	
    //저장 취소 또는 오류 발생 시 저장 하지않음
	if (saveResult == null || saveResult == false)
	{
		e.DownloadOperation.Cancel();
		return;
	}
	System.Threading.SynchronizationContext.Current.Post((_) =>
	{
		using (deferral)
		{
			// Hide the default download dialog.
			e.Handled = true;
			e.ResultFilePath = webSaveFilePath;
		}
	}, null);
}

 

 

 

반응형
반응형

WebView2 사용방법

 

새로운 인터넷 웹뷰2를 사용하려면 패키지를 추가로 설치해주어야함

아래 스샷참고하여 패키지 설치를 먼저한 다음 코드를 작성해주면 됨

 

솔루션 우클릭 후 솔루션용 Nuget 패키지 관리 클릭

 

 

찾아보기 후 Webview 검색한 다음 Microsoft.Web.WebView2 클릭

 

 

webview를 선택한 다음 안정적인 버전 설치를 눌러 패키지 설치를 마침

 

 

 

 

Microsoft.Web.WebView2.Wpf.WebView2 webView = null;

public MainWindow()
{
    InitializeComponent();
    if (webView == null) webViewInit();
}


private void webViewInit()
{
    webView = new Microsoft.Web.WebView2.Wpf.WebView2();
    webView.Loaded += webView_Loaded;
}

private async void webView_Loaded(object sender, RoutedEventArgs e)
{
    webView.Source = new Uri("http://www.naver.com");    
    await webView.EnsureCoreWebView2Async(); //초기화하여 null return 방지
    
    //webView.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false;
    //우클릭 방지, 웹뷰 새로 로드하거나 페이지 변경되면 false 풀려서 load할 때마다 추가해줘야됨
}


private void callWebView_Click(object sender, RoutedEventArgs e)
{
    webViewGrid.Children.Add(webView);

}

 

 

webView.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false;

사용한 웹뷰2에서 우클릭 방지를 하고싶다면 ContextMenusEnabled 값을 false로 주면 된다

 

 

<Window x:Class="webView.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:webView"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <Canvas Background="SkyBlue" Grid.Row="0">
            <Button x:Name="callWebView" Click="callWebView_Click" >웹뷰열기</Button>
        </Canvas>
        <Grid  Background="Salmon" Grid.Row="1" x:Name="webViewGrid"></Grid>
    </Grid>
</Window>

 

 

 

참고 : https://learn.microsoft.com/en-us/microsoft-edge/webview2/get-started/winforms

 

Get started with WebView2 in WinForms apps - Microsoft Edge Development

Getting started guide for using WebView2 for WinForms apps.

learn.microsoft.com

 

반응형

+ Recent posts