脱浏览器应用开发全解析
立即解锁
发布时间: 2025-08-26 01:40:53 阅读量: 4 订阅数: 27 

### 脱浏览器应用开发全解析
#### 1. 与 JavaScript 交互
在开发过程中,我们常常需要实现与 JavaScript 的交互。`InvokeScript()` 方法就为我们提供了这样的能力,它的第二个参数可以接受一个可选的字符串数组作为参数传递给 JavaScript 函数,并且会将 JavaScript 函数的返回值作为自身的返回值。示例代码如下:
```csharp
object result = browser.InvokeScript("AddTwoNumbers", new string[] { "1", "2" });
```
为了响应 JavaScript 方法,我们可以处理 `WebBrowser.ScriptNotify` 事件。当 JavaScript 代码调用 `window.external.notify` 时,这个事件就会触发。例如,在 JavaScript 代码块中使用如下语句:
```javascript
window.external.notify("This is a notification from JavaScript")
```
我们可以在事件处理程序中获取这个字符串,代码如下:
```csharp
private void Browser_ScriptNotify(object sender, NotifyEventArgs e)
{
MessageBox.Show("Received message: " + e.Value);
}
```
不过需要注意的是,`WebBrowser` 控件并不支持某些特定的脚本类型系统。
#### 2. 通知窗口
通知窗口通常会在屏幕的右下角弹出(在 Mac 上则显示在屏幕顶部),类似于 Outlook 通知新邮件或者 Messenger 提醒新即时消息的窗口。在 Silverlight 中,基本的通知窗口是一个 400 像素宽、100 像素高的空白框,我们可以将其尺寸缩小,但不能增大。创建通知窗口的步骤如下:
1. 创建 `NotificationWindow` 类的实例。
2. 通过设置其 `Content` 属性来放置通知内容。
如果我们希望通知窗口包含除了普通文本块之外的内容,可以创建一个自定义用户控件,并将其实例设置为 `NotificationWindow.Content` 属性的值。以下是一个自定义通知窗口内容的示例:
```xml
<UserControl x:Class="ElevatedTrust.CustomNotification" ...>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Border Background="LightGray" Height="20">
<TextBlock Margin="3" FontSize="10"
Text="MyApplication Notification"></TextBlock>
</Border>
<Border Grid.Row="1">
<Border.Background>
<LinearGradientBrush>
...
</LinearGradientBrush>
</Border.Background>
<TextBlock x:Name="lblMessage" Margin="10" FontWeight="Bold" FontSize="16"
Foreground="White" TextWrapping="Wrap" HorizontalAlignment="Center"
VerticalAlignment="Center">Notification goes here.</TextBlock>
</Border>
</Grid>
</UserControl>
```
自定义用户控件的代码中暴露了一个 `Message` 属性,用于设置文本块的内容:
```csharp
public string Message
{
get
{
return lblMessage.Text;
}
set
{
lblMessage.Text = value;
}
}
```
要显示通知窗口,我们可以按照以下步骤操作:
```csharp
if (Application.Current.IsRunningOutOfBrowser)
{
CustomNotification notification = new CustomNotification();
notification.Message = "You have just been notified. The time is " +
DateTime.Now.ToLongTimeString() + ".";
NotificationWindow window = new NotificationWindow();
window.Content = notification;
// 指定窗口关闭前的毫秒数,此示例设置为 5 秒
window.Show(5000);
}
else
{
// 通知窗口不可用,可以实现其他通知策略
}
```
用户无法移动通知窗口,但我们可以在通知窗口内添加一个按钮,调用 `NotificationWindow.Close()` 方法,让用户在通知超时前关闭它。
通知窗口没有内置的排队机制,如果在第一个通知窗口仍可见时创建并显示第二个通知窗口,新的通知消息将会丢失。为了解决这个问题,我们可以将 `NotificationWindow` 作为类级字段存储,并在显示新通知前关闭当前通知:
```csharp
private NotificationWindow window = new NotificationWindow();
CustomNotification notification = new CustomNotification();
notification.Message = "You have just been notified. The time is " +
DateTime.Now.ToLongTimeString() + ".";
window.Content = notification;
window.Close();
window.Show(5000);
```
如果应用中可能会在短时间内出现多个通知,上述方法可能会在用户阅读通知之前将其隐藏。此时,我们可以实现一个排队系统,基本思路是维护一个应用范围的 `Queue<T>` 集合来存储通知消息,并处理 `NotificationWindow.Closed` 事件,在事件触发时出队下一条消息并显示通知窗口。
#### 3. 主窗口控制
普通的 Silverlight 应用在浏览器窗口中运行,只能通过 JavaScript 与窗口进行交互。而脱浏览器应用则拥有独立的窗口,我们可以通过 `Application.MainWindow` 属性以 `Window` 对象的形式与之交互。`Window` 类提供了一些属性和方法,如下表所示:
| 属性 | 描述 |
| ---- | ----
0
0
复制全文
相关推荐










