Behavior de Fullscreen para Silverlight

Publiquei mais uma behavior no Expression Gallery hoje. Dessa vez foi uma behavior bem simples que serve para mudar o estado de full screen da aplicação. Essa behavior é do tipo Action, ou seja, você pode escolher qual trigger vai dispará-la. A trigger padrão que o Blend coloca é a EventTrigger, mas qualquer outra trigger pode ser utilizada.

image

A behavior também tem um segunda propriedade que serve para definir que a aplicação deve continuar em full screen caso perda o foco. Esse comportamento é uma das novidades do Silverlight 4 e pode ser usado, por exemplo, para deixar um vídeo rodando em fullscreen em um monitor enquanto trabalhamos no outro.

O código usado para realizar essas tarefas é muito simples, como pode ser visto abaixo:

//Código para mudar o fullscreen Application.Current.Host.Content.IsFullScreen = !Application.Current.Host.Content.IsFullScreen;

//Código para manter a janela em fullscreen em outro monitor Application.Current.Host.Content.FullScreenOptions = System.Windows.Interop.FullScreenOptions.StaysFullScreenWhenUnfocused;

Seguem abaixo os links:

O projeto do Codeplex onde está essa behavior vai continuar recebendo adições como essa. Tenho várias outras behaviors que estou planejando migrar pra lá assim como bibliotecas de controles e helpers que também terão versões para WPF e ASP.NET quando fizer sentido.

Reset da senha de “sa” no SQL Express

UPDATE 25/08/2010 : Novo post com os passos mais detalhados

Hoje tive um problema com o SQL Express 2008 que está instalado no meu computador. Esse computador que estou usando foi configurado recentemente pelo suporte da empresa mas o SQL Express foi configurado sem colocar o grupo de administradores local como administrador do banco de dados. Sei que isso é considerado boa prática de segurança quando instalamos servidores de banco de dados mas é uma regra de segurança que não se aplica (ou não deveria ser aplicada) quando se fala de computadores de desenvolvimento e com SQL Express, que por padrão só aceita conexões locais.

O que aconteceu foi que meu SQL Express só tinha 1 administrador, o “sa” (como eu disse antes, o grupo de administradores do Windows não foi configurado como admin desse sql), e a pessoa que fez a instalação da máquina não está mais na empresa e não documentou a senha utilizada na instalação do SQL Express. Como resolver isso?

Fiz várias buscas tentando descobrir como reiniciar a senha de sa mas quase tudo que achei levava em consideração que a senha estava em branco (por incrível que pareça isso ainda é muito comum). Foi então que achei o um post de Deepak explicando como resolver esse problema sem ter que reinstalar o SQL. O post foi escrito para SQL Server 2005 full (não express) mas a dica funciona também nas versões express e 2008. Vou colocar abaixo os passos que segui (os comandos dos passos 1, 2, 4 e 5 foram executados no prompt de comando do DOS rodando com privilégio de administrador):

UPDATE 25/08/2010 : Novo post com os passos mais detalhados

  1. Parar o serviço do SQL Express: NET STOP MSSQL$SQLEXPRESS
  2. Reiniciar o serviço do SQL Express em modo Single User : NET START MSSQL$SQLEXPRESS /m
  3. Conectar no SQL usando o SQL Server Management Studio e fazer as alterações desejadas (trocar a senha do usuário sa e adicionar o grupo de adminitradores local como sysadmin do sql)
  4. Parar novamente o serviço do SQL Express usando o mesmo comando do passo 1.
  5. Reiniciar novamente o serviço em modo normal, usando o comando do passo 2 mas sem a opção /m.

Como e por que isso funciona?

Quando o SQL Server é executado em modo Single User, todos os administradores locais passam a fazer parte também do grupo de administradores do SQL Server, mesmo que ele não esteja configurado dessa forma. Sendo assim agora podemos fazer as correções/alterações necessárias sem que seja necessário reinstalar o SQL Server. Esse recurso é uma especie de modo de segurança que existe justamente para corrigir esse tipo de problema.

No meu caso, como se tratava da instância padrão de um SQL Express, o nome do serviço era MSSQL$SQLEXPRESS. Se fosse a instância padrão de um SQL Full o nome do serviço seria MSSQLSERVER.

Tags: SQL Dicas

Behavior para filtrar galerias Deep Zoom por tags

Acabei de publicar no Expression Gallery uma behavior para filtrar imagens em uma colleção do Deep Zoom.

image

Essa behavior, quando aplicada a um objeto do tipo MultiScaleImage, permite que se filtre as imagens dessa coleção de forma semelhante ao que acontece no site Memorabilia do HardRock Café.

O uso da behavior é muito simples:

  • Anexe a behavior à um objeto MultiScaleImage.
  • Defina as propriedades Source e MetadataUri da behavior respectivamente para a url da galeria e o arquivo de metadados da galeria.
  • Defina o valor da propriedade Filter da behavior para o filtro que quer aplicar.

A behavior trabalha com o arquivo de metadados gerado pelo Deep Zoom Composer para saber quais tags estão associadas a cada imagem. Ela entende tags separadas por vírgula (,) tanto para atribuir às imagens quanto para filtrar. Filtrar por múltiplas tags vai exibir todas as imagens que tenham pelo menos uma das tags do filtro.

O arquivo de metadados não precisa ser necessáriamente o mesmo gerado pelo Composer, mas deve ter o mesmo formato. A behavior o campo ZOrder do arquivo de metadados para saber qual é cada imagem, portanto, se esse arquivo for gerado manualmente deve se tomar o cuidado de garantir que estão sendo atribuídas as tags às imagens certas e sempre que a galeria for atualizada o arquivo de metadados também precisará ser atualizado.

A behavior também expõe uma propriedade (AvailableTags) que é um array contendo todas as tags disponíveis na galeria atual. Isso pode ser bem útil se quisermos exibir na tela todas as tags, como fiz no exemplo que está no Expression Gallery.

Cada vez que o filtro for alterado, a galeria será filtrada e ocorrerá uma animação para exibir as imagens desejadas. É possível controlar o tempo dessa animação e sua função de Easing.

As imagens são posicionadas de forma a preecher o espaço do controle da melhor forma possível, mas ainda preciso melhorar a lógica para quando apenas uma imagem é exibida.

Também há espaço para melhorias no algorítmo de posicionamento, no que diz respeito ao alinhamento das imagens do lado direito.

O código fonte está disponível no Codeplex. Sugestões, melhorias e bug fixes podem ser reportados lá ou aqui no blog.

Em breve estarei aumentando essa biblioteca do Codeplex com outras behaviors e helpers.

Ahhh, quem gosta de futebol pode ver essa behavior em ação em http://www.msnnacopa.com.br.

Silverlight 4 - Novo xaml parser e suporte namespaces xml

O Silverlight 4 foi lançado na semana passada é já existe uma tonelada de posts com informações a respeito das novidades. Eu estava lendo um post do blog do Silverlight SDK e encontrei uma novidade interessante sobre a qual não se está falando muito. O parser de xaml do Silverlight 4 agora respeita corretamente as definições de namespace xml. Isso tem várias implicações:

  • Agora o namespace padrão dos seus arquivos xml não precisa mais ser “http://schemas.microsoft.com/winfx/2006/xaml/presentation”. Você pode mudar se for útil/necessário para sua aplicação (por exemplo, se você estiver gerando xaml dinamicamente utilizando apenas controles customizados).
  • Com esse suporte, agora é possível criar os seus próprios namespaces, agrupando vários namespaces da sua apliação ou mesmo de diversos assemblies distintos.
  • Frameworks como o Silverlight Toolkit e o SDK já estão tirando proveito disso, definindo seus próprios namespaces para simplificar sua utilização e eliminar a necessidade de ter que conhecer toda a estrutura desses projetos para saber onde estão os controles que queremos usar.

Ou seja, agora é possível ter acesso a todos os controles do Silverlight Toolkit ou SDK acrescentando apenas 2 namespaces na sua tela, como abaixo (mas lembre-se que ainda é necessário fazer referencias as dlls):

xmlns:toolkit=”http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit xmlns:sdk=”http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk

Tudo isso é muito interessante e muito legal mas o que me deixou intrigado é que eu não estava conseguindo encontrar informações em nenhum lugar que explicassem como é que eu poderia fazer meus frameworks e apis tirarem proveito desses recursos. Cheguei até a achar por um momento que esses novos namespaces estivesses fixos no Silverlight 4, mas como não era esse o discurso, tinha que have um jeito de implementarmos isso em nossas aplicações.

Foi então que eu tive a idéia de seguir um conselho que o Scott Hanselman vive repetindo quase como um mantra que é “ler código alheio para se tornar um programador melhor”. Tendo isso em mente eu fui ao codeplex e comecei a fuçar no código fonte do Silverlight Toolkit, até que achei o que estava procurando. Para que você possa tirar proveito desse recurso em suas próprias aplicações e frameworks, basta marcar o assembly com os atributos XmlnsPrefix e XmlnsDefinition, como demonstrado abaixo:

[assembly: XmlnsPrefix(http://schemas.wf.com.br/sdk, "wf")] [assembly: XmlnsDefinition(http://schemas.wf.com.br/sdk, "WF.Silverlight")] [assembly: XmlnsDefinition(http://schemas.wf.com.br/sdk, "WF.Silverlight.Controles")]

O lugar ideal para definir esses atributos é no arquivo AssemblyInfo do projeto. Para poder utilizar esses atributos é necessário referenciar o namespace System.Windows.Markup nas instruções de using no top da página.

O atributo XmlnsPrefix serve para criar um namespace e pré-definir qual será o seu prefixo quando um controle for adicionado diretamente pelo Visual Studio ou Expression Blend. Geralmente haverá apenas 1 atributo desse por projeto.

O atributo XmlnsDefinition é o responsável por vincular um namespace xml com um namespace do assembly. Esse atributo pode ser adicionado ao assembly quantas vezes for necessário. Geralmente haverá um atributo desse para cada namespace do assembly que contenha controles ou elementos que se deseja disponibilizar no xaml.

Uma coisa muito interessante que eu descobri é que os namespaces que você criar aparecem no intellisense do Visual Studio 2010, como pode ser visto abaixo:

 image

Espero que essas dicas tenham sido úteis. Eu sei que vou tirar proveito dessa nova funcionalidade nos meus próximos projetos.

Update 30/04/2010 : Encontrei um problema na implementação que demonstrei aqui. Devido a uma limitação do compilador do Silverlight, não é possível atribuir a propriedade x:Name a um controle definido por meio do novo xmlns se esse controle fizer parte do mesmo assembly em que está sendo utilizado. Ficou meio confuso, então vou tentar dar um exemplo:

Temos uma solution com um projeto. Esse projeto tem o seguinte xmlns:  xmlns:my=http://schema.minhaempres.silverlight e um controle chamado ControleA que está sendo “coberto” por esse xmlns. Se eu criar um ControleB nesse projeto, definir o uso do namespace “my” e utilizar o ControleA com a seguinte sintax, vai funcionar : . Se eu tentar atribuir a propriedade x:Name no meu ControleA, não vai mais funcionar. O problema é apenas com a propriedade x:Name e apenas se ambos os controles estiverem no mesmo assembly. Muitas vezes a gente consegue criar telas inteiras sem precisar dar nomes aos campos, principalmente graças ao uso de data binding, mas se for necessário fazer alguma animação, manipular o controle via code behind ou utilizar em algum TemplatePart de outro controle, tem que ter name.

Agora a boa notícia. Como esse erro só acontece se os 2 controles em questão estiverem no mesmo assembly, o workaround é simples, basta utilizar a declaração convencional de xmlns que usamos normalmente, onde dizemos o nome do assembly e namespace da classe.

Silverlight 4 RTM disponível para download

O Silverlight 4 RTM já está disponível para download.

O runtime do Silverlight 4 tem apenas 6 Mb. Em comparação, o Silverlight 3 tinha 4,7 e o Silverlight 2 tinha 4,77 (sim, o Silverlight 2 era maior que o Silverlight 3).

O Silverlight 4 Tools do para Visual Studio 2010 também está disponível para download no mesmo site. Se você pretende desenvolver aplicações utilizando Silverlight 4, este é o download que você deve fazer. Ele tem aproximadamente 30 Mb e é composto dos seguintes pacotes:

  • Runtime do Silverlight 4 RTW para desenvolvimento
  • SDK do Silverlight 4 RTW
  • Tooling para Visual Studio 2010 RTM (ferramentas e templates de projeto)
  • WCF RIA Services Release Candidate (com licença go-live)

Por conter a versão Release Candidate do WCF RIA Services, o Silverligth 4 Tools para Visual Studio 2010 também está marcado como RC, mas isso não significa que ele não esteja pronto para ser utilizado em produção. Prova disso é que o WCF RIA Services RC vem com licença go-live, que significa que já pode ser utilizado publicamente e terá suporte da Microsoft. A versão RTW do WCF RIA Services e, consequentemente, do Silverlight 4 Tools deve ser lançada ainda nesse semestre.

Também foram liberados hoje o Silverlight 4 Toolkit – Abril 2010 e o Expression Blend 4 Release Candidate. A versão final do pacote Expression Studio 4 também deve ser lançada ainda nesse semestre, mas não há nenhuma data definida. Vale lembrar que o upgrade do Expression 3 para o 4 será gratuito, portanto, se você não tem ainda não precisa esperar sair a próxima versão. Pode comprar agora.