2010-04-04 9 views
11

Ich entwickle eine Anwendung basierend auf OptiTrack SDK (von NaturalPoint). Ich muss das Anwendungsfenster als "Immer im Vordergrund" ausführen. Das Fenster ist in XAML entworfen und wird in der Klasse "CameraView" gesteuert, aber es scheint keine "TopMost" -Eigenschaft oder Äquivalent zu enthalten. Anbei sind der Code von "CameraView.xaml.cs" und der Code von "CameraView.xaml", die Teil von OptiTrack SDK (NaturalPoint) sind, genannt "Single_Camera_CSharp_.NET_3.0".Einstellung eines XAML-Fensters immer oben (aber keine TopMost-Eigenschaft)

Man könnte erwarten, dass die Klasse CameraView Eigenschaften oder Member enthält, um die Position des Fensters auf dem Bildschirm zu setzen oder auf TopMost zu setzen, aber soweit ich gesucht habe, habe ich nichts gefunden. Ich frage mich, was ich tun soll.

Danke, Brian

================

"CameraView.xaml.cs"

using System; 
using System.IO; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Navigation; 
using System.Drawing.Imaging; 
using System.Drawing.Drawing2D; 
using System.Windows.Threading; 

namespace TestProject 
{ 
public partial class CameraView 
{ 
private const int NP_OPTION_OBJECT_COLOR_OPTION = 3; 
private const int NP_OPTION_VIDEO_TYPE = 48; 
private const int NP_OPTION_NUMERIC_DISPLAY_ON = 71; 
private const int NP_OPTION_NUMERIC_DISPLAY_OFF = 72; 
private const int NP_OPTION_FETCH_RLE = 73; 
private const int NP_OPTION_FETCH_GRAYSCALE = 74; 
private const int NP_OPTION_FRAME_DECIMATION = 52; 
private const int NP_OPTION_INTENSITY = 50; 
private const int NP_OPTION_SEND_EMPTY_FRAMES = 41; 
private const int NP_OPTION_THRESHOLD = 5; 
private const int NP_OPTION_EXPOSURE = 46; 
private const int NP_OPTION_SEND_FRAME_MASK = 73; 
private const int NP_OPTION_TEXT_OVERLAY_OPTION = 74; 
// public delegate void OnCameraViewCreate(CameraView camera); 
// public static OnCameraViewCreate onCameraViewCreate; 
private System.Drawing.Bitmap raw = new System.Drawing.Bitmap(353, 288, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
private int mFrameCounter; 
private int mDisplayCounter; 
private DispatcherTimer timer1 = new DispatcherTimer(); 
private bool mVideoFrameAvailable = false; 
private int mNumeric = -1; 
private bool mGreyscale = false; 
private bool mOverlay = true; 
public CameraView() 
{ 
this.InitializeComponent(); 

timer1.Interval = new TimeSpan(0, 0, 0, 0, 10); 
timer1.Tick += new EventHandler(timer1_Tick); 
} 

public int Numeric 
{ 
get { return mNumeric; } 
set 
{ 
mNumeric = value % 100; 
if (mNumeric >= 0) 
{ 
if (Camera != null) 
Camera.SetOption(NP_OPTION_NUMERIC_DISPLAY_ON, value % 100); 
} 
} 
} 

private bool CameraRunning = false; 
private OptiTrack.NPCamera mCamera; 
public OptiTrack.NPCamera Camera 
{ 
get { return mCamera; } 
set 
{ 
if (mCamera == value) return; //== Don't do anything if you're assigning the same camera == 

if (mCamera != null) 
{ 
//== Shut the selected camera down ==<< 

if (CameraRunning) 
{ 
CameraRunning = false; 
mCamera.Stop(); 
mCamera.FrameAvailable -= FrameAvailable; 
} 
} 

mCamera = value; 

if (mCamera == null) 
{ 
mNumeric = -1; 
} 
else 
{ 
serialLabel.Content = "Camera "+mCamera.SerialNumber.ToString(); //mNumeric.ToString(); 
} 
} 
} 

private void FrameAvailable(OptiTrack.NPCamera Camera) 
{ 
mFrameCounter++; 

try 
{ 
OptiTrack.NPCameraFrame frame = Camera.GetFrame(0); 
int id = frame.Id; 
if (CameraRunning) 
{ 
GetFrameData(Camera, frame); 
} 

frame.Free(); 
} 
catch (Exception) 
{ 
int r = 0; 
r++; 
} 
} 
private void GetFrameData(OptiTrack.NPCamera camera, OptiTrack.NPCameraFrame frame) 
{ 
BitmapData bmData = raw.LockBits(new System.Drawing.Rectangle(0, 0, raw.Width, raw.Height), 
ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

int stride = bmData.Stride; 
System.IntPtr bufferPtr = bmData.Scan0; 
unsafe 
{ 
byte* buffer = (byte*)(void*)bufferPtr; 
camera.GetFrameImage(frame, bmData.Width, bmData.Height, bmData.Stride, 32, ref buffer[0]); 
} 
raw.UnlockBits(bmData); 
mVideoFrameAvailable = true; 
} 

private void timer1_Tick(object sender, EventArgs e) 
{ 
if (CameraRunning && mVideoFrameAvailable) 
{ 
mVideoFrameAvailable = false; 
cameraImage.Source = Img(raw); 
mDisplayCounter++; 
} 
} 

private System.Windows.Media.ImageSource Img(System.Drawing.Bitmap img) 
{ 
System.Drawing.Imaging.BitmapData bmData = img.LockBits(new System.Drawing.Rectangle(0, 0, img.Width, img.Height), 
System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppPArgb); 

System.Windows.Media.Imaging.BitmapSource bitmap = System.Windows.Media.Imaging.BitmapSource.Create(
img.Width, img.Height, 96, 96, PixelFormats.Bgra32, 
System.Windows.Media.Imaging.BitmapPalettes.WebPalette, 
bmData.Scan0, bmData.Stride * bmData.Height, bmData.Stride); 
img.UnlockBits(bmData); 

return bitmap; 
} 
private void startStopButton_Click(object sender, RoutedEventArgs e) 
{ 
if (CameraRunning) 
StopCamera(); 
else 
StartCamera(); 
} 

public void StartCamera() 
{ 
if (Camera != null) 
{ 
mFrameCounter = 0; 
mDisplayCounter = 0; 

Camera.FrameAvailable += FrameAvailable; 

Camera.SetOption(NP_OPTION_VIDEO_TYPE, 0); 
Camera.SetOption(NP_OPTION_FRAME_DECIMATION, 1); 

Camera.SetOption(NP_OPTION_INTENSITY, 0); 
Camera.SetOption(NP_OPTION_EXPOSURE, 10); 
Camera.SetOption(NP_OPTION_THRESHOLD, 50); 
Camera.SetOption(NP_OPTION_OBJECT_COLOR_OPTION, 0); 
SetOverlayOption(); 
SetGreyscaleOption(); 

timer1.Start(); 
Camera.Start(); 
CameraRunning = true; 
this.Numeric = mNumeric; 

startStopButton.Content = "Stop Camera"; 
} 
} 
private void SetGreyscaleOption() 
{ 
if(mGreyscale) 
Camera.SetOption(NP_OPTION_VIDEO_TYPE, 1); 
else 
Camera.SetOption(NP_OPTION_VIDEO_TYPE, 0); 
} 
private void SetOverlayOption() 
{ 
if(mOverlay) 
Camera.SetOption(NP_OPTION_TEXT_OVERLAY_OPTION, 255); 
else 
Camera.SetOption(NP_OPTION_TEXT_OVERLAY_OPTION, 0); 
} 

public void StopCamera() 
{ 
if (Camera != null) 
{ 
Camera.Stop(); 
timer1.Stop(); 
CameraRunning = false; 
Camera.FrameAvailable -= FrameAvailable; 
Camera.SetOption(NP_OPTION_NUMERIC_DISPLAY_OFF, 0); 
startStopButton.Content = "Start Camera"; 
} 
} 

private void greyscaleButton_Click(object sender, RoutedEventArgs e) 
{ 
if(mGreyscale) 
mGreyscale = false; 
else 
mGreyscale = true; 
SetGreyscaleOption(); 
} 

private void OverlayButton_Click(object sender, RoutedEventArgs e) 
{ 
if(mOverlay) 
mOverlay = false; 
else 
mOverlay = true; 
SetOverlayOption(); 
} 

private void exposureSlider_ValueChanged(object sender, RoutedEventArgs e) 
{ 
if (mCamera!=null) 
{ 
mCamera.SetOption(NP_OPTION_EXPOSURE, (int) this.exposureSlider.Value); 
} 
} 

private void thresholdSlider_ValueChanged(object sender, RoutedEventArgs e) 
{ 
if (mCamera != null) 
{ 
mCamera.SetOption(NP_OPTION_THRESHOLD, (int)this.thresholdSlider.Value); 
} 
} 

private void optionsButton_Click(object sender, RoutedEventArgs e) 
{ 
if (!propertyPanel.IsVisible) 
propertyPanel.Visibility = Visibility.Visible; 
else 
propertyPanel.Visibility = Visibility.Collapsed; 
} 
} 
} 

=== =============

"CameraView.xaml"

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
x:Class="TestProject.CameraView" 
x:Name="CameraView1" 
Width="Auto" Height="Auto" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2006" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
> 

<Grid x:Name="LayoutRoot" Width="Auto" Height="Auto"> 
    <Grid.Background> 
    <x:Null/> 
    </Grid.Background> 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition Width="*"/> 
    <ColumnDefinition Width="113.904"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
    <RowDefinition Height="26.667"/> 
    <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <Grid Margin="0,0,0,0" Grid.ColumnSpan="2"> 
    <Rectangle RadiusX="1.25" RadiusY="1.25" Margin="0,0,0,0" VerticalAlignment="Stretch"> 
    <Rectangle.Fill> 
    <LinearGradientBrush EndPoint="0.492,0.149" StartPoint="0.492,0.843"> 
     <GradientStop Color="#FF000000" Offset="0"/> 
     <GradientStop Color="#FF23283F" Offset="1"/> 
    </LinearGradientBrush> 
    </Rectangle.Fill> 
    <Rectangle.Stroke> 
    <LinearGradientBrush EndPoint="0.291,-4.231" StartPoint="1.668,18.025"> 
     <GradientStop Color="#FF000000" Offset="0"/> 
     <GradientStop Color="#FFFFFFFF" Offset="1"/> 
    </LinearGradientBrush> 
    </Rectangle.Stroke> 
    </Rectangle> 
    <Rectangle RadiusX="3.333" RadiusY="3.333" Opacity="0.13" Margin="0,0,0,13"> 
    <Rectangle.Fill> 
    <SolidColorBrush Color="#FFFFFFFF"/> 
    </Rectangle.Fill> 
    <Rectangle.Stroke> 
    <x:Null/> 
    </Rectangle.Stroke> 
    </Rectangle> 
    </Grid> 
    <Image Margin="0,0,0,0" x:Name="cameraImage" Grid.ColumnSpan="2" Grid.Row="1"/> 
    <Label x:Name="serialLabel" FontSize="10" FontWeight="Bold" Foreground="#FFDEDADA" Content="Camera 10024" HorizontalAlignment="Right" Margin="0,0,4,0" VerticalAlignment="Top" Grid.Column="1"> 
    <Label.BitmapEffect> 
    <OuterGlowBitmapEffect GlowColor="#FF000000" GlowSize="4" Opacity="0.7"/> 
    </Label.BitmapEffect> 
    </Label> 
    <WrapPanel Margin="3,3,3,3"> 
    <Button HorizontalAlignment="Stretch" Margin="0,0,0,0" x:Name="startStopButton" Width="100" Height="Auto" BorderThickness="0,0,0,0" Content="Start Camera" Click="startStopButton_Click"/> 
    <Button x:Name="optionsButton" Width="61.474" Height="Auto" BorderThickness="0,0,0,0" Content="Options" Click="optionsButton_Click"/> 
    </WrapPanel> 
    <Grid Visibility="Visible" d:LayoutOverrides="HorizontalAlignment, VerticalAlignment" HorizontalAlignment="Right" Margin="0,0,16,16" x:Name="propertyPanel" VerticalAlignment="Bottom" Width="169.237" Height="81.455" Grid.ColumnSpan="2" Grid.Row="1"> 
    <Rectangle Stroke="#FFFFFFFF" StrokeThickness="3" Margin="0,0,0,0"> 
    <Rectangle.BitmapEffect> 
    <DropShadowBitmapEffect/> 
    </Rectangle.BitmapEffect> 
    <Rectangle.Fill> 
    <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5"> 
     <GradientStop Color="#FF1E212F" Offset="0"/> 
     <GradientStop Color="#FF313551" Offset="1"/> 
    </LinearGradientBrush> 
    </Rectangle.Fill> 
    </Rectangle> 
    <Slider HorizontalAlignment="Stretch" Margin="62.633,5,4.681,0" x:Name="exposureSlider" VerticalAlignment="Top" Width="Auto" Height="Auto" Orientation="Horizontal" Maximum="255" ValueChanged="exposureSlider_ValueChanged"/> 
    <Label x:Name="serialLabel_Copy" FontSize="10" FontWeight="Bold" Foreground="#FFDEDADA" Content="Exposure" HorizontalAlignment="Left" Margin="3.853,3.853,0,0" VerticalAlignment="Top" Width="57.352"> 
    <Label.BitmapEffect> 
    <OuterGlowBitmapEffect GlowColor="#FF000000" GlowSize="4" Opacity="0.7"/> 
    </Label.BitmapEffect> 
    </Label> 
    <Label x:Name="serialLabel_Copy1" FontSize="10" FontWeight="Bold" Foreground="#FFDEDADA" Content="Threshold" d:LayoutOverrides="Height" HorizontalAlignment="Left" Margin="3.853,27.691,0,0" VerticalAlignment="Top" Width="59.829"> 
    <Label.BitmapEffect> 
    <OuterGlowBitmapEffect GlowColor="#FF000000" GlowSize="4" Opacity="0.7"/> 
    </Label.BitmapEffect> 
    </Label> 
    <Slider x:Name="thresholdSlider" Width="Auto" Orientation="Horizontal" Maximum="253" d:LayoutOverrides="Height, Margin" Margin="62.633,27.691,4.681,0" VerticalAlignment="Top" Minimum="54" Value="54" ValueChanged="thresholdSlider_ValueChanged"/> 
    <Button x:Name="greyScaleButton" Width="75.333" Content="Greyscale" Click="greyscaleButton_Click" HorizontalAlignment="Left" Height="21" d:LayoutOverrides="Height" Margin="8,53.761,0,0" VerticalAlignment="Top"/> 
    <Button x:Name="Overlay" Height="21" Content="Overlay" Click="OverlayButton_Click" d:LayoutOverrides="Height" HorizontalAlignment="Right" Margin="0,53.761,8,0" VerticalAlignment="Top" Width="64"/> 
    </Grid> 
</Grid> 
</UserControl> 

Antwort

30

Die Eigenschaft Topmost existiert in der Klasse Window: http://msdn.microsoft.com/en-us/library/system.windows.window.topmost.aspx.

Ihre CameraView Klasse ist von UserControl abgeleitet, das eine Art Steuerelement ist, das in einem Fenster (oder einem anderen Container wie einer Page sitzt, aber das ist hier nicht wichtig). UserControl hat keine Top-Eigenschaft, da sie nicht unabhängig auf dem Desktop angezeigt wird.

Gastgeber Ihre CameraView in einem Fenster und stellen Sie die Window.Topmost:

<!-- MyWindow.xaml --> 
<Window ... 
     xmlns:local="clr-namespace:TestProject" 
     Topmost="True"> 
    <local:CameraView /> 
</Window> 

wo die Ellipsen die Standard-klebrige Masse wie x:Class und WPF Xmlns Erklärungen darstellen, die Visual Studio für Sie erstellt.

+0

Dies ist die beste und einfachste Lösung, die ich gefunden habe. – Rarepuppers

4

Dies ist UserControl. Sie können die TopMost-Eigenschaft nur für Windows festlegen

14

In dem UserControl-Code hinter können Sie einen Verweis auf das Fenster abrufen, das es hostet, und dann die Eigenschaft Topmost festlegen. Beispiel,

Window parent = Window.GetWindow(this); 
parent.Topmost = true; 
Verwandte Themen